Spring AOP 的手动 cjlib 动态代理

Spring AOP 的手动 cjlib 动态代理

使用 cjlib 需要导入的包

  • 使用 cglib需要两个jar包:asm.jar和cglib.jar

  • 也可以直接导入 spring-core 包,该包中有上面两个包

代码过程

编写目标类(切入点)

​ 创建目标类 UserServiceImpl :

public class UserServiceImpl {

    public void addUser() {
        System.out.println("adduser");
    }
    public void updateUser() {
        System.out.println("updateuser");
    }
    public void deleteUser() {
        System.out.println("deleteuser");
    }
}

编写切面类(通知)

​ 创建切面类 MyAspect:

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

编写工厂类

​ 创建工厂类 MyBeanFactory:

public class MyBeanFactory {

    public static UserServiceImpl createUserService(){
        //目标类
        final UserServiceImpl service = new UserServiceImpl();
        //切面类
        final MyAspect myAspect = new MyAspect();

        //CGLIB 字节码增强
        /*
            没有接口,只有实现类
            采用字节码增强框架 cglib,在运行时创建目标子类,从而对目标进行增强
            导入jar包
         */
        //代理类

        //核心类。
        //Enhancer 增强因子
        Enhancer enhancer = new Enhancer();
        //确定父类
        enhancer.setSuperclass(service.getClass());
        /*
            设置回调函数,MethodInterceptor 这个接口就等效于InvacationHandler
            参数一、二、三和invoke一样
        */
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //前方法
                myAspect.before();

                //执行目标方法
                Object obj = method.invoke(service, args);
                //和下面一样的
                //它将会去执行代理类的父类,执行目标(目标类和代理类 父子关系)
                //Object obj = methodProxy.invokeSuper(proxy, args);

                //后方法
                myAspect.after();
                return obj;
            }
        });

        //创建代理
        UserServiceImpl proxyService = (UserServiceImpl) enhancer.create();

        return proxyService;
    }
}

测试代码

UserServiceImpl userService = (UserServiceImpl) MyBeanFactory.createUserService();
userService.addUser();
userService.updateUser();
userService.deleteUser();

有错误请指出!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值