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.

     从这些构造函数的参数类型中,有没有猜出什么端倪?先看Class[] proxyInterfaces,它指定代理对象的接口,也就是说该ProxyFactory可以获得这些接口实现类的代理对象,参数是接口数组,任何类只要实现了这些接口中的一个就可以通过该ProxyFactory获得该实现类的代理对象【一定要与JDK动态代理中的接口联系起来理解】。当然,仅指定了代理的接口是不够的,还需要制定Advice,Interceptor指定拦截器。Object target指定需要代理的目标对象。建议大家看看ProxyFactory的父接口AdvisedSupport接口,该接口提供了对Advice、Advisor和Interfaces的操作,也是我们编程中所直接使用得到的。
     有点事,先下线,有空接着复习,否则害怕刚看了一遍又忘得差不多了。说实在话自己都不确定这些文章对阅读者有没有哪怕一点帮助,如果有我相信也是对于随意的复习和回忆有点作用,对于新学者,建议不要看类似的文章了。写博客权当自己复习的一种方法吧,阿门!

你可能感兴趣的:(spring,jdk,AOP,编程)