概要
过度
我们上面记录了 BeanFactory
的增强——ApplicationContext
。到那里基本上Spring的最常用的两大特性之一:依赖注入已经讲完了。接下来我们开始分析Spring最常用的第二大特性:面向切面。
AOP,全称 Aspect Oriented Programming ,即面向对象编程,是对 Java 的 OOP (Object Oriented Programming)的一个非常有效的补充,可以在不侵入Java核心业务代码的情况下对一些通用操作进行补全。
内容简介
本文主要对AOP进行引入,同时对Spring中AOP的实现进行整体思路的梳理,方便后面对AOP的实现环节进行一一介绍。
所属环节
AOP引入、总览
上下环节
上文: 对Spring依赖注入的完整介绍
下文: 对Spring中AOP各个实现环节的详细介绍
思路概述
跟对我对Spring的AOP项目的粗略阅读,我认为Spring对AOP的实现主要分为以下两步:
- 根据各种增强的配置信息,创建动态代理实例
- 创建的动态代理执行过程中安排好各种增强
其中,最开始我以为创建动态代理的思路如下:
1.png主要分成两个环节,第一环节是生成增强器Advisor
并完成注册。第二环节是根据生成的Advisor
,对需要的实例创建代理。后来才反应过来,并不是在扫描到aop的标签就进行对应增强器的扫描和注册的,因为在扫描这个标签后面可能继续扫描,这里还没注册全。所以,应该使用懒加载,因为在开始创建实例时,一定是加载完成的:
创建好的动态代理的使用思路也很简单,因为增强器的配置是灵活的,所以Spring采用了拦截器链的方法进行实现:
3.png时序图画的相当粗糙,但大概意思就是这样。
我们接下来会分三节来介绍Spring的AOP实现原理,分别从
- 根据Bean实例找出合适的增强器
- 处理Bean实例并根据需求创建动态代理
- 动态代理的工作原理
三个环节介绍Spring的AOP的实现原理。
源码解析
入口
照例我们这里选择一个能贯穿Spring的AOP编程的Demo。我们在使用AOP时一般都会先在对应的xml中配置:
<aop:aspectj-autoproxy />
来激活Spring扫描@Aspect
的功能,然后会自行定义一个类来声明一个切面:
@Aspect
@Component
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around(value = "@annotation(com.LogPoint)")
public Object executeAnnotation(ProceedingJoinPoint jp) throws Throwable {
// do something
Object obj = jp.proceed();
// do something
return obj;
}
}
这样就完成了对Spring的AOP编程,被 com.LogPoint
注解的类/方法在调用的前后会执行你写的逻辑。
扩展
AOP 的几个注解的使用,我记得之前专门记录过,温习一遍。
网友评论