004-Spring AOP源码分析

原理分析

CGLIb

java 复制代码
OrderService orderService = new OrderService();

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OrderService.class);
//如果是需要所有方法都执行的setCallback
//在setCallbacks 如果设置了多个Callback 那么必须setCallbackFilter
enhancer.setCallbacks(new Callback[]{
        new MethodInterceptor() {
        	//第一个参数是代理对象 官方文档上写明了 如果invoke传入o则发生循环调用
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("执行了代理内容1");
                return methodProxy.invoke(orderService, objects);
            }
        },
        new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("执行了代理内容2");
                return methodProxy.invoke(orderService, objects);
            }
        },

});
enhancer.setCallbackFilter(new CallbackFilter() {
    @Override
    public int accept(Method method) {
        //指这个方法所执行代理intercept 的下标
        return 1;
    }
});

OrderService orderServiceProxy = (OrderService) enhancer.create();
System.out.println(orderServiceProxy.getOrderId());

动态代理

java 复制代码
BillApi phoneBill = new PhoneBillImpl();

BillApi phoneBillProxy = (BillApi) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{BillApi.class}, new InvocationHandler() {
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        System.out.println("执行方法前代理");
        return method.invoke(phoneBill, objects);
    }
});

System.out.println(phoneBillProxy.getId());

Spring 统一封装

一个是继承,一个是实现,都有各自适用的场景

但是都是一个实例方法的增强

所以统一封装便于使用

java 复制代码
接口类代理
BillApi phoneBill = new PhoneBillImpl();

ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(phoneBill);
proxyFactory.addAdvice(new MethodBeforeAdvice() {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("执行前代理");
    }
});
proxyFactory.addAdvice(new AfterReturningAdvice() {
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("执行后代理");
    }
});
BillApi proxy = (BillApi)proxyFactory.getProxy();
proxy.userName();
java 复制代码
非接口代理:
OrderService orderService = new OrderService();

ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(orderService);
proxyFactory.addAdvice(new MethodBeforeAdvice() {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("执行前代理");
    }
});
proxyFactory.addAdvice(new AfterReturningAdvice() {
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("执行后代理");
    }
});

OrderService proxy = (OrderService)proxyFactory.getProxy();
proxy.getOrderId();

屏蔽了底层的代理工具的切换

抽象了代理方法Advice

不需要再手动调用:被代理类(原型)的方法

相关推荐
树獭叔叔5 分钟前
GRPO:比PPO更简单的RLHF算法
后端·aigc·openai
shelter7 分钟前
并发操作session对象导致登录闪退问题
后端
兆子龙17 分钟前
TypeScript高级类型编程:从入门到精通
前端·后端
IT_陈寒25 分钟前
Python开发者的效率革命:这5个技巧让你的代码提速50%!
前端·人工智能·后端
MekoLi2941 分钟前
Spring AI 与 LangChain4j 从入门到精通:Java 后端开发者的 AI 实战手册
后端·面试
我真会写代码41 分钟前
深度解析并发编程锁升级:从偏向锁到重量级锁,底层原理+面试考点全拆解
java·并发编程·
树獭叔叔1 小时前
从RLHF到PPO:让AI学会说人话
后端·aigc·openai
Meepo_haha1 小时前
创建Spring Initializr项目
java·后端·spring
会编程的土豆1 小时前
C++中的 lower_bound 和 upper_bound:一篇讲清楚
java·数据结构·算法
Memory_荒年1 小时前
SpringBoot事务源码深度游:从注解到数据库的“奇幻漂流”
java·后端·spring