004-Spring AOP源码分析

原理分析

CGLIb

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());

动态代理

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 统一封装

一个是继承,一个是实现,都有各自适用的场景
但是都是一个实例方法的增强
所以统一封装便于使用

接口类代理
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();
非接口代理:
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
不需要再手动调用:被代理类(原型)的方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值