AOP(Aspect-OrientedProgramming,面向方面编程)是OOP(Object-Oriented Programing,面向对象编程)的良好补充与完善,后者侧重于解决
从上到下的存在明显层次逻辑关系的问题,而前者则侧重于由左至右的水平散布的无明显逻辑关系但具备相同行为的问题。AOP抽象的是相同的行为而非
关联的行为,用于提供通用服务支持,而非业务逻辑处理,其核心思想是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。
AOP植入有多种不同方式,主要分为以下三种方式:
- 编译期植入
- 类装载期植入
- 动态代理植入
Spring中AOP具体的配置过程,可通过以下途径:
- 配置ProxyFactoryBean,显式设置advisors, advice, target等
- 配置AutoProxyCreator,使用定义bean的方式不变,但是从容器中获得的是代理对象
最顶层是ProxyConfig是一个数据,这个数据基类为ProxyFactoryBean这样的子类提供了配置属性;
AdvisedSupport的封装了Aop对通知和通知器的相关操作,这些操作对于不同的Aop的代理对象的生成都是一样的,
但对于具体的Aop代理对象的创建,AdvisedSupport把它交给它的子类们去完成;对于ProxyCreatorSupport,
可以将它看成是其子类创建Aop代理对象的一个辅助类;具体的Aop代理对象的生成,根据不同的需要,
分别由ProxyFactoryBean、ProxyFactory、AspectJProxyFactory来完成
AbstractAutoProxyCreator 实现了BeanPostProcessor,当系统比较复杂或者中需要进行aop织入的bean较多时,
简单采用ProxyFacotryBean无疑会增加很多工作量,同时由于要从ProxyFactoryBean获得代理对象,也会使应用
和Spring之间的耦合度增加,这样的情况下,自动Aop代理的方式就能发挥它巨大的优势了。
AOP对象的生成
1.ProxyFactory是怎样得到代理类的
public Object getProxy() { return createAopProxy().getProxy(); } protected final synchronized AopProxy createAopProxy() { if (!this.active) { activate(); } return getAopProxyFactory().createAopProxy(this); }
2.ProxyFactoryBean是怎样获得代理类的
ProxyFactoryBean是在Spring IoC环境中。
@Override public Object getObject() throws BeansException { initializeAdvisorChain(); //初始化通知器 if (isSingleton()) { return getSingletonInstance();//依据定义生成单例的Proxy } else { if (this.targetName == null) { logger.warn("Using non-singleton proxies with singleton targets is often undesirable. " + "Enable prototype proxies by setting the ‘targetName‘ property."); } return newPrototypeInstance(); //这里依据定义生成prototype的Proxy } }
参考:
网易乐得技术团队:Spring-SpringMVC父子容器&AOP使用总结
原文地址:https://www.cnblogs.com/yuyutianxia/p/7587038.html