Spring AOP(3):Spring Advice
首先接上一篇文章,我们来看看JDK动态代理和Cglib实现的代理有哪些不经如人意的地方:
对目标类中的所有业务方法都添加了横切逻辑代码,但是现实中我们只需要inhance特定的方法【这点其实可以通过在intercept方法或invoke方法中对目标类进行判断而达到只对特定类的特定方法进行代码织入】都用硬编码的方式指定了横切逻辑的植入位置,例子中都是在方法调用前后植入织入目标代码,但现实中我们可能需要在抛出异常时织入目标代码,或者只在方法前面织入。这种需求的多样性就要求织入点应该是可以灵活选择或者灵活配置的为不同的目标类创建代理对象时需要编写不同的创建过程代码,无法做到通用Cglib和JDK动态代理各有优缺点,最好能够把两者统一起来实现AOP
下面来看看Spring Advice的5个类型:
ThrowsAdvice:在目标类的方法抛出异常后进行逻辑代码的织入BeforeAdvice:前置Advice,但是Spring只支持方法级别的前置Advice,所以提供了子接口MethodBeforeAdvice,用于在目标方法执行前织入逻辑代码MethodInterceptor:在方法执行前后织入目标代码,注意区别cglib的MethodInterceptor和aop alliance的MethodInterceptor。AfterReturningAdvice:后置Advice,在方法返回后进行目标代码的织入IntroductionInterceptor:相对于前面四个这个比较特殊,它可以在目标类中增加一些属性和方法,而不像前面四种那样在围绕方法织入目标代码。
总结起来就这5中Advice就是:一男一女,一前(MethodBeforeAdvice)一后(AfterReturningAdvice),前前后后(MethodInterceptor),碰到了第三者(IntroductionInterceptor),抛出异常的爱(ThrowsAdvice)……
在使用代理的过程中,我们都需要通过ProxyFactory获得目标对象的代理对象。先来看看ProxyFactory的构造方法:
ProxyFactory() Create a new ProxyFactory.ProxyFactory(Class[] proxyInterfaces) Create a new ProxyFactory.ProxyFactory(Class proxyInterface, Interceptor interceptor) Create a new ProxyFactory for the given interface and interceptor.ProxyFactory(Class proxyInterface, TargetSource targetSource) Create a ProxyFactory for the specified TargetSource, making the proxy implement the specified interface.ProxyFactory(Object target) Create a new ProxyFactory.