Spring:六、ProxyFactory使用

文章介绍了Spring的ProxyFactory如何实现AOP编程式代理,包括JDK动态代理和CGLIB代理,以及如何使用Advisor链增强目标对象的方法。通过实例展示了MethodBeforeAdvice、AfterReturningAdvice和ThrowsAdvice的使用,并解释了自定义异常处理和MethodInterceptor的执行顺序。此外,还探讨了如何通过自定义增强逻辑实现异步执行的可能性。

Spring:六、ProxyFactory使用

1 前言

Spring提供了编程式AOP代理方式,而不依赖于Spring Ioc,即ProxyFactory。使用此种方式可以很方便的使用JDK动态代理或CGLIB代理,且支持Advisor chain的使用,可以通过advisor链,增强需要代理的对象方法。

文档描述:

It is easy to create AOP proxies programmatically with Spring. 
This lets you use Spring AOP without dependency on Spring IoC.

The interfaces implemented by the target object are automatically proxied. 
The following listing shows creation of a proxy for a target object, 
with one interceptor and one advisor:

实例代码:

ProxyFactory factory = new ProxyFactory(myBusinessInterfaceImpl);
factory.addAdvice(myMethodInterceptor);
factory.addAdvisor(myAdvisor);
MyBusinessInterface tb = (MyBusinessInterface) factory.getProxy();

Spring文档参考:

https://docs.spring.io/spring-framework/docs/5.3.27/reference/html/core.html#aop-prog

2 使用

接口定义:

interface Fruit {
   
   
    void eat(String name);

    static void sale() {
   
   
        System.out.println("静态sale方法");
    }

    default void buy() {
   
   
        System.out.println("默认buy方法");
    }
}

实现类:

class Grape implements Fruit {
   
   

    @Override
    public void eat(String name) {
   
   
        System.out.println("eat:" + name);
    }

}

Spring底层源码可知,调用ProxyFactory的getProxy()方法,不论是cglib的实现ObjenesisCglibAopProxy,还是JDK代理的JdkDynamicAopProxy实现,MethodInvocation的实现都是使用ReflectiveMethodInvocation或其子类(子类也是调用super.proceed())。且它们实现都会调用ProxyFactory的父类AdvisedSupport的getInterceptorsAndDynamicInterceptionAdvice方法,用于获取advice的执行Chain。其中会使用DefaultAdvisorAdapterRegistry来调用getInterceptors方法注册所有的interceptors,而这个Registry类的适配器adaptors有3个,用于注册Spring自身提供的一些advice,即MethodBeforeAdviceAdapter,AfterReturningAdviceAdapter,ThrowsAdviceAdapter,只要它们的supportsAdvice方法返回true,则该adive也会被添加到执行的chain中,即advice是MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice的子类实现即可。

由此我们可以自定义如下的增强逻辑:

前置增强:

class BeforeAdi implements MethodBeforeAdvice {
   
   
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
   
   
        System.out.println("前置执行...");
    }
}

返回值后增强:

class AfterReturnAdi implements AfterReturningAdvice {
   
   
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
   
   
        System.out.println("返回值后, 执行...");
    }
}

而ThrowsAdvice的调用较为特殊,即必须含有public方法afterThrowing,参数这里取1个,因为只要是Throwable的子类实现即可,所以这里可以自定义业务异常,用于处理发生自定义业务异常的场景:

自定义业务异常:

class 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值