spring课程学习——第6课

实现aop(这里只实现xml配置的方式)

    1.实现的两种方式

                  

    在运行期实现aop法1:继承。客户端持有的是父类,实际上运行的是动态生成继承客户端待增强持有类的子类。(用到CGLib技术,用字节码生成一个子类)

        在运行期实现aop法2:接口实现。若客户端实现类实现了一个接口,则可以在此接口下再写一个动态生成的实现类。(若客户端实现类为final类则无法用法1继承,只能用法2)(Java动态代理,同样可以用字节码生成一个子类)

      2.在xml中aop的配置

      关于aop中一些专业术语的说明:

  • 切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例 如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext 中<aop:aspect>来配置。
  • 连接点(Joinpoint) :程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者BServiceImpl.barB(String _msg, int _type)抛出异常等行为。
  • 通知(Advice) :“切面”对于某个“连接点”所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,例如TestAspect
  • 切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(* com.spring.service.*.*(..))来决定。

   

     解析pointcut:在Spring中提供了两个接口,并用AspectJExpressionPointcut来实现这两个接口。

     

     解析method:在Spring中提供了MethodLocatingFactory,getObject()方法返回的即是这个Method。

                            

     3.实现指定次序的链式调用

   

     Spring定义的拦截器

    实现按顺序调用的类和方法

    4.实现AOP与CGLib的结合,得到aop的动态代理

    5.从XML中创建BeanDefinition

    之前的Bean定义是非常简单的,而现在增加了aop之后的bean定义变得非常复杂,拿aop:before来举例,它其中有ref和method两个属性,spring的处理方法是,pointcut和method都分别作为一个类,从而我们现在要解决“类中类”的解析。

     对于before标签实体类的创建,spring通过特定的构造器来创建,但出现了构造方法中类的类型不匹配的问题

    spring的解决方法:把构造方法作修改,第三个advice...Factory的类型修改成AspectInstanceFactory,而第一个保持不变。但是MethodLocatingFactory要继承FactoryBean,而FactoryBean它的作用是专门用来生成对象的(下面的getObject()方法),因此,在获得MethodLocatingFactory类型的Bean时,会再生成一个Method类型的对象与构造函数匹配。

中间经过一系列对Bean的解析,最终得到了Bean的定义,最后一步是要得到Bean的对象。在对Bean初始化之后调用BeanPostProcessorafterinitialization(),创建“代理”。

    经过上述操作,实现给定一个AopConfig,使用CGlib生成一个对象的动态代理。

猜你喜欢

转载自blog.csdn.net/lianup/article/details/81432653
今日推荐