Spring AOP
- AOP(Aspect Oriented Programming) 面向切面变成,与之相对应的OOP面向对象编程
- 异步使用AOP的时候,我们将它作为面向对象编程的一种补充,所以我们总是说AOP是对IOC的一种补充或者一种增强
- AOP的技术使用在分布砸系统的各个模块,但是在模块执行前,后,或者异常情况时候我们增加一个处理逻辑,例如日志,缓存等。
Spring AOP 基本概念
Advice
- Advice通知:定义在连接点该做什么,为切面的增强提供接口,也就是我们具体实现增强代码逻辑的方法,包括如下
- BeforeAdvice:在切点前执行
- AfterAdvice:在切点后
- AfterReturningAdvice:在切点方法返回后执行
- ThrowsAdvice:异常情况执行
- Spring AOP中,对每个通知类型都定义了一个接口,如上BeforeAdvice类型,我们最终需要实现MethodBeforeAdvice接口并且实现其中的 before 方法完成我们增强实现
PointCut
- 决定Advice通知应该作用在哪个连接点上,也就是说PotionCut来定义需要增强的方法的集合,这些集合的选取安一定规则来完成
public interface Pointcut {
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
Pointcut TRUE = TruePointcut.INSTANCE;
}
- 如上PointCut接口定义了一个getMethodMatcher方法,返回的是一个接口MethodMatcher,由这个MethodMatcher接口的实现类来完成对目标方法的筛选
- 在MethodMatcher的实现中包括
- JdkRegexpMethodPointcut :通过JDK正则表达式匹配
- AnnotationMethodMatcher:通过注解的方式匹配
Advisor 通知器
- 完成对目标方法的切面增强(Advice) 和 切点(PointCut)以后,需要一个Advisor将他们结合起来,完成这个的就是Advisor
AopProy代理对象生成
-
在SpringAop模块中,主要是通过配置和 调用Spring的ProxyFactoryBean来完成AOP的代理实现的。
-
ProxyFactoryBean是ProxyConfig的一个子类,ProxyConfig是一个数据的基础类,他为子类提供了配置属性的解析,一次来获取一个代理信息的基础数据,比如Adice ,PointCut,Advisor等信息在xml文件中的配置由他来载入
-
ProxyFactoryBean同时也是FacotryBean的一个子类,
- FactoryBean是Spring高度可扩展性的一个典型案例,他可以让我们自定义Bean的生成规则,并且将生产的bean加入IOC容器中
- FactoryBean中包含三个方法,isSingle,getObjectType,getObject
- ProxyFactoryBean中的getObject方法就是SpringAop实现的核心方法,利用ProxxyConfig生产的代理类书籍,依靠底层JDK或者CGLIB的实现,对代理对象Target的一个封装,一次来达到动态代理的目的
-
如下是ProxyFactoryBean的一个简单UML图
-
代理模式图解,代理对象通过持有被代理对象的引用,在执行具体方法的时候通过调用被持有代理对像的引用来完成被代理对象的方法,并且同时增加自己的增强方法,Spring AOP中的设计思想也是同样的。
-
SpringAop中策略模式,最终代理方法实现CgLibAopProxy,JDKDynamicAopProxy通过配置文件中设置来选择,默认JDKDynamic