一:概述以及目录
前两篇的源码解析,涉及到很多基础知识,但是源码的解读都不难,这篇⽂章刚好相反,依赖的基础知识不多,但 是源码⽐较难懂。 下⾯我会简单介绍⼀下 AOP 的基础知识,以及使⽤⽅法,然后直接对源码进⾏拆解。目录如下:
二:基础知识
2.1 什么是 AOP ?
AOP 的全称是 “Aspect Oriented Programming”,即⾯向切⾯编程。
在 AOP 的思想⾥⾯,周边功能(⽐如性能统计,⽇志,事务管理等)被定义为切⾯,核⼼功能和切⾯功能分别独 ⽴进⾏开发,然后把核⼼功能和切⾯功能“编织”在⼀起,这就叫 AOP。
AOP 能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑封装起来,便于减少系统的重复代码,降低模块间的 耦合度,并有利于未来的可拓展性和可维护性。
2.2 AOP 基础概念
- 连接点(Join point):能够被拦截的地⽅,Spring AOP 是基于动态代理的,所以是⽅法拦截的,每个成员⽅ 法都可以称之为连接点;
- 切点(Poincut):每个⽅法都可以称之为连接点,我们具体定位到某⼀个⽅法就成为切点; 增强/通知
- (Advice):表示添加到切点的⼀段逻辑代码,并定位连接点的⽅位信息,简单来说就定义了是⼲什 么的,具体是在哪⼲;
- 织⼊(Weaving):将增强/通知添加到⽬标类的具体连接点上的过程;
- 引⼊/引介(Introduction):允许我们向现有的类添加新⽅法或属性,是⼀种特殊的增强;
- 切⾯(Aspect):切⾯由切点和增强/通知组成,它既包括了横切逻辑的定义、也包括了连接点的定义。
上⾯的解释偏官⽅,下⾯⽤“⽅⾔”再给⼤家解释⼀遍。
切⼊点(Pointcut):在哪些类,哪些⽅法上切⼊(where); 通知(Advice):在⽅法执⾏的什么时机(when:⽅法前/⽅法后/⽅法前后)做什么(what:增强的功 能); 切⾯(Aspect):切⾯ = 切⼊点 + 通知,通俗点就是在什么时机,什么地⽅,做什么增强; 织⼊(Weaving):把切⾯加⼊到对象,并创建出代理对象的过程,这个由 Spring 来完成。
5 种通知的分类:
- 前置通知(Before Advice):在⽬标⽅法被调⽤前调⽤通知功能;
- 后置通知(After Advice):在⽬标⽅法被调⽤之后调⽤通知功能;
- 返回通知(After-returning):在⽬标⽅法成功执⾏之后调⽤通知功能;
- 异常通知(After-throwing):在⽬标⽅法抛出异常之后调⽤通知功能;
- 环绕通知(Around):把整个⽬标⽅法包裹起来,在被调⽤前和调⽤之后分别调⽤通知功能。
2.3 AOP 简单示例
新建 Model 类:
@Data
@Service
public class Model {
public void everyDay() {
System.out.println("睡觉");
}
}
复制代码
添加 ModelAspect 切⾯:
@Aspect
@Component
public class ModelAspect {
@Pointcut("execution(* com.java.Model.everyDay())")
private void myPointCut() {
}
// 前置通知
@Before("myPointCut()")
public void myBefore() {
System.out.println("吃饭");
}
// 后置通知
@AfterReturning(value = "myPointCut()")
public void myAfterReturning() {
System.out.println("打⾖⾖。。。");
}
}
复制代码
applicationContext.xml 添加:
<!--启⽤@Autowired等注解-->
<context:annotation-config/>
<context:component-scan base-package="com" />
<aop:aspectj-autoproxy proxy-target-class="true"/>
复制代码
程序⼊⼝:
public class MyTest {
public static void main(String[] args) {
ApplicationContext context =new
ClassPathXmlApplicationContext("classpath:applicationContext.xml");
M