目录
1.6.3 切面类(通知类)改造、简化切入点表达式、加注解用于扫包
2.3.1 PlatformTransactionManager
2.3.2 TransactionDefinition(了解)
一、springAOP
1.1、概述
AOP:全称是 Aspect Oriented Programming
即:面向切面编程,是一种【编程范式】。
作用:在程序【运行期间】,不修改源码的基础上对已有方法进行增强
优势:
减少重复代码
提高开发效率
维护方便
AOP 的实现方式: 动态代理
依赖jdk的Proxy
依赖cglib的Enhancer
1.2、spring的AOP
【1】AOP相关术语: 面试点
-
Target(目标对象): 要增强的对象(被代理的类对象)
-
Proxy(代理对象) : 对目标对象的增强的对象 (生成的代理类对象)
-
Joinpoint(连接点): 目标对象中的所有方法(被代理类中的所有方法)
-
Pointcut(切入点): 要被增强的方法(被代理类中要增强的方法)
-
Advice(通知/增强): 增强的那段【代码方法】以及代码切入的位置
通知包含了2个维度内容:在什么位置,切入什么
示例:
前置通知:在方法之前进行增强
后置通知 :在方法之后进行增强
异常通知:在方法异常进行增强
最终通知 :最终执行的方法进行增强
环绕通知: 单独使用(以上所有通知)
- Aspect(切面): 切入点+通知=切面
目标方法和增强方法合到在一起 叫做切面
说白了切面描述了在什么样的目标方法下(切入点)的什么位置(通知类型)切入了什么样的(增强代码)
-
Weaving(织入):
将增强的代码(方法)合并到目标方法的过程 叫织入过程;
Spring AOP底层实现技术就是动态代理
spring底层会自动抉择使用Jdk Proxy或Enhancer(cglib)
1.3、AOP开发方式
- XML方式
- XML+注解方式
- 注解方式
1.4、 全xml方式实现AOP
案例分析:
案例: 对AccountServiceImpl下的方法进行增强;
步骤如下:
1.导入相关jar坐标;
2.自己封装要增强方法,并保存在某个专用类中【切面类/通知类/增强类】
3.将所有进行AOP操作的资源【切面类+目标对象】加载到IOC容器中;
3.编写配置文件
告诉spring【切面类中的增强方法】在哪个对象的哪个方法上增强使用;
1.4.1 jar包
<dependencies>
<!-- spring核心jar包,已经依赖的AOP的jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- spring整合单元测试的jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- 单元测试的jar -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- 切入点表达式 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
</dependencies>
1.4.2 接口及实现类(目标对象)
public interface AccountService {
void add();
void update();
void delete();
String findAll(String s);
}
public class AccountServiceImpl implements AccountService {
@Override
public void add() {
Sys