Spring学习笔记---4-AOP代码实现及源码解释

来源:互联网 发布:php $a & 7 变量 编辑:程序博客网 时间:2024/04/30 17:51
一、AOP的实现者

      AOP的工作目标就是将横切的问题,如:性能监控,事务处理,日志处理等,进行模块化。使用类似于OOP的方式进行切面的编程工作。位于AOP工具核心的是连接点模型,它提供了一种机制,可以识别出在哪里发生了横切。
   
      注解:AOP的上述中提到的连接点,切点,增强,目标对象,引介,织入,代理,切面的这些个概念可能不是很容易理解,但是它的工作宗旨很容易去理解:就是在做的时候比如说砍树,那么在砍树之前要做什么,在砍树之后要做什么。
       
      Spring AOP 使用动态代理技术在运行期织入增强的代码,SpringAOP使用了两种代理机制:一种是基于JDK的动态代理;另一种是基于CGLib的动态代理。之所以需要两种代理机制,很大程度上因为JDK本身只需要提供接口的代理,而不支持类的代理。

二、切面类型
         
       切面(Advisor):包含连接点和横切代码,Spring使用org.springframework.aop.Advisor接口表示切面的概念。
       切面分为三类:一般切面,切点切面,和引介切面等。
            Advisor:代表一般切面,它仅包含一个Advice,前面说过,Advice包含了横切代码合连接点的信息,所以Advice本身就是一个简单的切面,只不过它代表的横切连接点是所有目标类的所有方法,因为这个横切面太宽泛,所以一般不会直接使用。
            PointcutAdivisor:代表具有切点的切面,包括Adivce和Pointcut两个类,这样就可以通过类、方法名及方法方位等信息灵活的定义切面的连接点,提供更具适用性的切面。
            IntroductionAdvisor:代表引介切面,引介切面是对应引介增强的特殊切面,它应用于类层面上,所以引介点使用ClassFilter进行定义。

       通过Advisor(切面,在有些书上解释为通知器),可以定义应该使用哪个通知并在那个关注点使用它,也就是说通过Advisor,把Advice和Pointcut结合起来,这个结合为使用IOC容器配置AOP使用,或者说即开即用的使用AOP基础设置,提供了便利。

三、JVM 的动态代理特性

       在Spring AOP 核心中使用到的是Proxy(动态代理)模式。通过JDK的动态代理模式,也就可以任何为Java对象创建代理对象,因为动态代理中有使用到Java的反射功能,也就是说调用了Java Reflaction API  来完成的。
       
           在上面的两幅图中的右图可以看到,Client(客户端)在调用Proxy()之后,Proxy()在调用RealSubject的request()方法之前和之后做了很多的工作,而这些对RealSubject来说是透明的,而目标对象(RealSubject)对这些的处理可以说毫不知情,这就是代理模式。
    
           
四、Spring AOP 的设计原理
      
       Spring AOP使用JDK的Proxy(代理)模式,以此为基础设计出了一系列的功能,如:前置增强,后置增强,环绕增强,异常增强等功能。
       
       在Spring 的AOP 模块中,一个主要的部分是代理对象的生成,而对于Spring应用,可以看到,是通过配置和调用Spring的ProxyFactoryBean来完成这个任务的。在ProxyFactoryBean中封装了主要代理对象的生成过程。在这个生成过程中,可以使用JDK的 Proxy和CGLIB两种生成方式。

       以ProxyFactory的设计为中心,可以看到相关的类继承关系,如图:
       
             
五、自动创建代理

      Spring提供了自动代理机制,让容器自动生成代理,把用户从繁琐的配置工作中解放出来。在内部,Spring 使用BeanPostProcessor自动完成这项工作。

       这些基于BeanPostProcessor 的自动代理创建的实现类,将根据一些规则自动在容器实例化时为匹配的Bean生成代理实例。
  • 基于Bean配置名规则的自动代理创建器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现名为BeanNameAutoProxyCreator;
  • 基于Advisor 匹配机制的自动代理创建器:它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(即为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator。
  • 基于Bean中AspectJ注解标签的自动代理创建器:为包含Aspect 注解的Bean自动创建代理实例,它的实现类为AnnotationAwareAspectJAutoProxyCreator,该类是Spring2.0的新增类。
     
      下图是自动代理创建器实现类的类继承图:
       
 


六、小结
      对于AOP的源码解释比较麻烦,暂且先写到这里,这篇文章在以后会继续完善,之后会探讨到过滤器,事务管理等模块。
      Spring采用采用JDK动态代理和CGLIB动态代理的技术在运行期织入增强,用户不需要装备特殊的编译器或类装载期就可以使用AOP的功能,要使用JDK动态代理,目标类必须实现接口,而CGLIB不对目标类做任何限制,它通过动态生成目标类与子类的方式提供代理。JDK在创建代理对象时性能高于CGLIB,而生成的代理对象的运行性能比CGLIB的低,所以,如果是singleton的代理,推荐使用CGLIB动态代理。
       Spring只能在方法级别上织入增强,Spring提供了4种类型的方法增强,分别是前置,后置,环绕,和异常增强等,还有一种是引介增强(较特殊)。
       切面是增强和切点的联合体,用户很方便的通过Spring提供的ProxyBeanFactory将切面织入不同的目标类中。当然,为每一个目标类手工配置一个切面是比较繁琐的,Spring利用BeanPostProcessor 可干涉Bean生命周期的机制,提供了一些可以自动创建代理,织入切面的自动代理创建器,其中DefaultAdivsorAutoProxyCreator是功能强大的自动代理创建器,它可以将容器中所有的Advisor自动织入目标Bean中。



参考书目:《Spring3.0就这么简单》
                   《Spring技术内幕:深入理解Spring架构及设计原理》
                   《Spring3.X企业应用开发实战》

      
0 0
原创粉丝点击