浅析org.springframework.aop.framework包设计 AOP框架Spring编程配置管理
程序员文章站
2022-06-08 21:18:00
...
写在前面:类的设计图见附件
本文不详细介绍AOP相关概念,比如Concrn(关注点),Aspect(方面),Adivce(通知),Pointcut(切入点),Joinpoint(连接点),AOP实现策略, 不同的AOP实现.但熟悉这些概念是基本的前提条件,相关概念可以查找Google,参考资料查到,Development.Without.Ejb中的第八章<<基于AOP概念的声明性中间件>>值得一读,其中讲到了Spring AOP框架的实现特点:AOP实现策略可以是动态代码,动态字节码. 运行时AopProxy对象的真实存在等.
我们主要关注Spring AOP框架核心org.springframework.aop.framework包的设计.
核心类介绍:
org.springframework.aop.framework.Advised此接口进行织入的准备工作,对那个Target使用什么Adivce在那些Pointcut上进行增强,都在此表达,如果理解成源代码级别的织入动作我感觉也不为过.
org.springframework.aop.framework.AopProxy此接口是Target被增强后的对象,
org.springframework.aop.framework.AopProxyFactory此接口是个工厂接口,此工厂根据Advised中提供的信息或者使用动态代理,或者使用动态字节码来生成AopProxy对象.
其它的接口,抽象类,具体类从名字上都能分辨出来.
org.springframework.aop.framework.Advised.ProxyConfig 代理配置类
org.springframework.aop.framework.Advised.AdvisedSupport 接口Advised的实现类,除此主要功能外,还附加上了一些便利功能.
org.springframework.aop.framework.Advised.DefaultAopProxyFactory
org.springframework.aop.framework.Advised.JdkDynamicAopProxy 接口AopProxy动态代理方式实现类
org.springframework.aop.framework.Advised.Cglib2AopProxy 接口AopProxy动态字节码方式实现类
org.springframework.aop.framework.Advised.ProxyFactory 编程方式的便利类
org.springframework.aop.framework.Advised.ProxyFactoryBean 配置方式的便利类
org.springframework.aop.framework.Advised.AdvisorChainFactory 对多个Advisor的管理
其它类都是工具类,异常类,或功能性类.
如果单看上面的描述应该是比较清晰的,但事实上org.springframework.aop.framework包中的类之间的关系看上去是比较复杂的,至少第一眼看上去是.
原因在于:ProxyConfig对AopProxyFactory的引用,这个引用困扰了我一段时间,我现再所能想到的就是这个类的关系设计图应该不是第一次设计就设计成这样子的,而是经过了演变,有了最基本的设计基础,然后增加了这个引用.
因为在AdvisedSupport增加了此便利方法:protected synchronized AopProxy createAopProxy(), 此便利方法的主要目的为它的扩展类ProxyFactory,ProxyFactoryBean服务.
ProxyFactoryBean实现了FactoryBean接口,这里可以忽略它所实现的BeanFactoryAware,AdvisedSupportListener,它的目的很明确,就是为配置方式提供便利,获得一个AopProxy对象.
ProxyFactory类的存在也困扰我一段时间,因为它几乎找不到对应的概念对应物,能解释通的在于它为编程方式使用Aop框架提供了便利方式,如果基本的标准作法需要三个角色来完成这项任务:源材料的准备-AdvisedSupport,工厂对象-AopProxyFactory,产品-AopProxy,那么此时ProxyFactory身兼三职:1:继承自AdvisedSupport;2:AdvisedSupport内部已经有了AopProxyFactory功能,AdvisedSupport.createAopProxy()方法就是为了此时而存在;3:实现了AopProxy接口,可以直接转型为AopProxy类型.
org.springframework.aop.framework包是Aop框架的实现,
其它包包括如:对Aop核心概念的完整实现,与Ioc框架的集成,Aspectj风格实现,注解风格等功能实现.
本文不详细介绍AOP相关概念,比如Concrn(关注点),Aspect(方面),Adivce(通知),Pointcut(切入点),Joinpoint(连接点),AOP实现策略, 不同的AOP实现.但熟悉这些概念是基本的前提条件,相关概念可以查找Google,参考资料查到,Development.Without.Ejb中的第八章<<基于AOP概念的声明性中间件>>值得一读,其中讲到了Spring AOP框架的实现特点:AOP实现策略可以是动态代码,动态字节码. 运行时AopProxy对象的真实存在等.
我们主要关注Spring AOP框架核心org.springframework.aop.framework包的设计.
核心类介绍:
org.springframework.aop.framework.Advised此接口进行织入的准备工作,对那个Target使用什么Adivce在那些Pointcut上进行增强,都在此表达,如果理解成源代码级别的织入动作我感觉也不为过.
org.springframework.aop.framework.AopProxy此接口是Target被增强后的对象,
org.springframework.aop.framework.AopProxyFactory此接口是个工厂接口,此工厂根据Advised中提供的信息或者使用动态代理,或者使用动态字节码来生成AopProxy对象.
其它的接口,抽象类,具体类从名字上都能分辨出来.
org.springframework.aop.framework.Advised.ProxyConfig 代理配置类
org.springframework.aop.framework.Advised.AdvisedSupport 接口Advised的实现类,除此主要功能外,还附加上了一些便利功能.
org.springframework.aop.framework.Advised.DefaultAopProxyFactory
org.springframework.aop.framework.Advised.JdkDynamicAopProxy 接口AopProxy动态代理方式实现类
org.springframework.aop.framework.Advised.Cglib2AopProxy 接口AopProxy动态字节码方式实现类
org.springframework.aop.framework.Advised.ProxyFactory 编程方式的便利类
org.springframework.aop.framework.Advised.ProxyFactoryBean 配置方式的便利类
org.springframework.aop.framework.Advised.AdvisorChainFactory 对多个Advisor的管理
其它类都是工具类,异常类,或功能性类.
如果单看上面的描述应该是比较清晰的,但事实上org.springframework.aop.framework包中的类之间的关系看上去是比较复杂的,至少第一眼看上去是.
原因在于:ProxyConfig对AopProxyFactory的引用,这个引用困扰了我一段时间,我现再所能想到的就是这个类的关系设计图应该不是第一次设计就设计成这样子的,而是经过了演变,有了最基本的设计基础,然后增加了这个引用.
因为在AdvisedSupport增加了此便利方法:protected synchronized AopProxy createAopProxy(), 此便利方法的主要目的为它的扩展类ProxyFactory,ProxyFactoryBean服务.
ProxyFactoryBean实现了FactoryBean接口,这里可以忽略它所实现的BeanFactoryAware,AdvisedSupportListener,它的目的很明确,就是为配置方式提供便利,获得一个AopProxy对象.
ProxyFactory类的存在也困扰我一段时间,因为它几乎找不到对应的概念对应物,能解释通的在于它为编程方式使用Aop框架提供了便利方式,如果基本的标准作法需要三个角色来完成这项任务:源材料的准备-AdvisedSupport,工厂对象-AopProxyFactory,产品-AopProxy,那么此时ProxyFactory身兼三职:1:继承自AdvisedSupport;2:AdvisedSupport内部已经有了AopProxyFactory功能,AdvisedSupport.createAopProxy()方法就是为了此时而存在;3:实现了AopProxy接口,可以直接转型为AopProxy类型.
org.springframework.aop.framework包是Aop框架的实现,
其它包包括如:对Aop核心概念的完整实现,与Ioc框架的集成,Aspectj风格实现,注解风格等功能实现.