Spring学习1_面向切面( AOP )实现原理

     面向切面编程 (Aspect Oriented Programming,简称AOP) 是Spring的一个重要特性,其原理是采用动态代理方式实现。

     下面通过一个Demo来模拟AOP实现

     整个代码目录结构如下:

     

       其中LogInterceptor类完成为所有Service方法添加日志记录的功能。

   1、Dao层实现

package com.dao;

public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("excute save;");
        
    }

    @Override
    public void delete() {
        System.out.println("excute delete;");
        
    }

}

    2、拦截器类实现 

package com.handler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


public class LogInterceptor implements InvocationHandler{
    
    private Object target;
    
    
    
    public void setTarget(Object target) {
        this.target = target;
    }

    public void beforMethod(Method method) {    
        System.out.println(method.getName() +"  start.");
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        beforMethod(method);
        method.invoke(target, args);
        return null;
    }

}

    3、AOP实际执行时是通过动态代理,对上述拦截器进行包装生成的代理类来完成切面功能的,测试如下:

 

package com.test;

import java.lang.reflect.Proxy;

import org.junit.Test;

import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.handler.LogInterceptor;

public class TestAop {

    @Test
    public void testAopProxy() {
        UserDao userDao = new UserDaoImpl();
        LogInterceptor logInterceptor = new LogInterceptor();
        logInterceptor.setTarget(userDao);
        UserDao proxyDao = (UserDao) Proxy.newProxyInstance(userDao.getClass()
                .getClassLoader(),  new Class[]{UserDao.class}, logInterceptor);
        proxyDao.save();
        proxyDao.delete();
    }
}

   测试结果如下:

     

posted @ 2015-07-16 13:25  Pisces_djl  阅读(683)  评论(0编辑  收藏  举报