SpringAOP之CGLIB字节码增强

SpringAOP的基础原理就是动态代理

有两种实现方式:
1)jdk动态代理

2)cglib动态代理

jdk动态代理和cglib动态代理的区别在于:

cglib没有接口(通过继承父类) 只有实现类。 
采用字节码增强框架cglib,在运行时 创建目标的子类 ,从而对目标类进行增强。

简单来说就是把目标类当jdk动态代理里的接口使用,把运行时创建的目标类的子类当jdk动态代理里的目标类使用。

下面通过一个案例来说明CGLIB动态代理 

目标类 ,实现了三个业务

public class UserServiceImpl{

  //添加用户信息(addUser)
public void addUser() { System.out.println("UserServiceDaoImpl addUser"); }
  //更新用户信息(updateUser)
public void updateUser() { System.out.println("UserServiceDaoImpl updateUser"); }   //删除用户信息(deleteUser) public void deleteUser() { System.out.println("UserServiceDaoImpl deleteUser"); } }

切面类 ,用于增强功能的类,里面就是具体的功能方法(通知)

public class MyAspect {
    //前方法
    public void before(){
        System.out.println("cglib_before");

    }
    //后方法
    public void after(){
        System.out.println("cglib_after");
    }
}   

工厂类 

工厂类步骤如下: 
1.目标类 
2.切面类 
3.代理类 
3.1 核心类 
3.2确定父类 
3.3设置回调函数 
而在设置回调函数里面和jdk动态代理类似 
设置回调函数 MethodInterceptor接口等效于jdk invocationHandler接口 
intercept()等效于jdk invoke() 
intercept参数1 ,参数2,参数3 和invoke三个参数一样 
参数4,methodProxy 方法代理 
可以使用methodProxy.invokeSuper(proxy, args);来执行父类的方法

public class MyProxyFactory {
    public static Object createUserService() {
        //目标类
        final UserServiceImpl userService = new UserServiceImpl();
        //切面类
        final MyAspect myAspect = new MyAspect();
        //代理类 采用cglib 底层创建目标的子类
        //核心类
        Enhancer enhancer=new Enhancer();
        //确定父类
        enhancer.setSuperclass(UserServiceImpl.class);
        /*
         *  设置回调函数 MethodInterceptor接口等效于jdk invocationHandler接口
         *  intercept()等效于jdk invoke()
         *  参数1 ,参数2,参数3 和invoke三个参数一样
         *  参数4,methodProxy  方法代理
         */
        enhancer.setCallback(new MethodInterceptor() {

            @Override
            public Object intercept(Object proxy, Method method, Object[] args,
                    MethodProxy methodProxy) throws Throwable {
                //前方法
                myAspect.before();
                //执行目标类的方法
                Object obj=method.invoke(userService, args);
                //后方法
                myAspect.after();
                return obj;
            }
        });
        Object proxy=enhancer.create();
        return proxy;
    }
}

运行结果: 

 

https://blog.csdn.net/su20145104009/article/details/54234607

posted @ 2018-07-24 17:28  xdyixia  阅读(545)  评论(0编辑  收藏  举报