Spring aop概述
Aop是Aspect-Oriented Programming(面向切面编程)的简称,Aspect是一种新的模块机制,用来描述分散在对象、类或函数中的横切关注点。从关注点中分离出横切关注点是面向切面的程序设计的核心概念。分离关注点使解决特定问题的代码从业务逻辑中独立出来,业务逻辑中的代码不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过切面来封装、维护,这样原本分散在整个应用程序中的变动就可以很好的管理起来。Spring Aop为IOC的使用提供了更多的便利,一方面,应用可以直接使用Aop的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的Aop的使用,灵活地编织到模块中,比如可以通过Aop来实现应用程序中的日志功能,另一方面,在Spring内部,一些支持模块也是通过Spring Aop来实现的,如事务管理。接下以ProxyFactoryBean的实现为例来了解Spring Aop的具体设计和实现。
1、设计原理
在Spring的Aop模块中,一个主要的部分是代理对象的生成,而对于Spring应用,可以看到,是通过配置和调用Spring的ProxyFactoryBean来完成这个任务的。在ProxyFactoryBean中,封装了主要代理对象的生成过程。在这个生成过程中,可以使用JDK的Proxy和CGLIB的两种生成方式。
以ProxyFactory为设计为中心,可以看到相关的类的继承关系如下图:
在这个类继承体系中,可以看到完成Aop应用的类,比如AspectJProxyFactory、ProxyFactoryBean和ProxyFactory,它们都在同一个类的继承体系下,都是ProxyConfig、AdvisedSupport和ProxyCreatorSupport的子类。作为共同基类,可以将ProxyConfig看出是一个数据基类,这个数据基类为ProxyFactoryBean这样的子类提供了配置属性;在另一个基类AdvistedSupport的实现中,封装了Aop对通知和通知器的相关操作,这些操作对于不同的Aop代理对象的生成都是一样的,但是对于具体的Aop代理对象的创建,AdvistorSupport把它交给它的子类们去完成;对于ProxyCreatorSupport,可以将它看作是其子类创建Aop代理对象的一个辅助类。通过继承以上提到的基类的功能的实现,具体的Aop代理对象的生成,根据不同的需要,分别由ProxyFactoryBean、AspectJProxyFactory和ProxyFactory来完成。