Spring 的AOP底层实现技术:JDK和CGLIB动态代理

Spring 的AOP实现技术之JDK的动态代理技术实例:

接口:IUserService

 

(Spring的AOP是动态AOP,实现技术:JDK提供的动态代理和cglib代理,
cglib它可以为没有实现接口的类做代理,也可以为接口类做代理.如果有接口,使用JDK动态代理,如果没有,使用cglib动态代理.)

利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理

 

1 public interface IUserService {
2     public void login(String username,String password);
3     public void regist();
4 }

实现类

 1 public class UserServiceImpl implements IUserService {
 2     @Override
 3     public void login(String username,String password) {
 4         System.out.println("登录......");
 5     }
 6     @Override
 7     public void regist() {
 8         System.out.println("注册.......");
 9     }
10 }

代理工厂

 1 //使用jdk的proxy完成动态代理工具
 2 public class JDKProxyFactory implements InvocationHandler{
 3 //创建目标对象,将传进来的对象赋值给本类对象就代理.
 4     private Object target;
 5     public  JDKProxyFactory(Object target){
 6         this.target=target;
 7     };      
 8 //通过目标对象创建代理对象
 9     public Object createProxy(){
10         //使用Proxy完成代理对象的创建
11         //得到目标对象的classLoder
12         ClassLoader loader = target.getClass().getClassLoader();
13         //得到目标对象的interfaces
14         Class<?>[] interfaces = target.getClass().getInterfaces();
15         //实现InvocationHandler接口,this就是创建代理对象的
16         return Proxy.newProxyInstance(loader, interfaces, this);
17     }
18     @Override
19     public Object invoke(Object proxy, Method method, Object[] args)
20             throws Throwable {
21         //在代理实例上处理方法调用并返回
22         //proxy是代理对象,method是调用的方法的method方法,args是调用的方法的参数
23         System.out.println("日志文件");
24         //target=UserServiceImpl--目标对象
25         return method.invoke(target, args);
26     }

测试类

1 public class ProxyTest {
2     @Test
3     public void test1(){
4     //创建目标对象
5     IUserService userService = new UserServiceImpl();
6     //创建代理对象
7     JDKProxyFactory factory = new JDKProxyFactory(userService);
8     IUserService userServiceProxy = (IUserService) factory.createProxy();
9     userServiceProxy.login("Tom","123");}}

 Spring 的AOP实现技术之CGLIB的动态代理技术实例:

CGLIB包底层是使用一个小而快的字节码处理框架ASM

 接口IUserService

public interface IUserService {
    public void login(String username,String password);
    public void regist();
}

实现类UserService

public class UserServiceImpl /*implements IUserService*/ {
    //@Override
    public void login(String username,String password) {
        System.out.println("登录......");
    }
    //@Override
    public void regist() {
        System.out.println("注册.......");
    }
}

CglibProxyFactory 代理工厂

public class CglibProxyFactory implements MethodInterceptor  {
 //得到目标函数
 private Object target;
 //使用构造方法传递目标对象
 public CglibProxyFactory(Object target){
      this.target=target;
 }
 //创建代理对象
 public Object createProxy(){
     //1.创建enhancer
    Enhancer enhancer = new  Enhancer();
    //2.传递目标对象
    enhancer.setSuperclass(target.getClass());
    //3.设置回调参数(相当于Invocationhandler)
    enhancer.setCallback(this);
    return enhancer.create(); 
 }
@Override
//增强目标对象
public Object intercept(Object proxy, Method method, Object[] args,
        MethodProxy methodProxy) throws Throwable {
    //在代理实例上处理方法调用并返回
    System.out.println("执行目标方法前");
  Object result =method.invoke(target, args);
   System.out.println("执行目标方法后");
     return result;

测试类

public class CglibTest {
    @Test
    public void test1(){
        //创建目标
        UserServiceImpl userSerice = new UserServiceImpl();
        //创建代理类,传递目标对象
    CglibProxyFactory factory= new CglibProxyFactory(userSerice);
    //生成IUserService的代理类
    UserServiceImpl userSericeproxy = (UserServiceImpl) factory.createProxy();
    userSericeproxy.login("tom", "123");
}

 

posted @ 2017-11-26 21:35  无~所~谓  阅读(331)  评论(0编辑  收藏  举报