Spring—Aop
提供声明式事务;允许用户自定义切面
以下名词需要了解下:
- 横切关注点:跨越应用程序多个模块的方法或功能。
- 切面(ASPECT):横切关注点 被模块化 的特殊对象。它是一个类。
- 通知(Advice):切面必须要完成的工作。它是类中的一个方法。
- 目标(Target):被通知对象。它是一个接口或者是一个方法
- 代理(Proxy):向目标对象应用通知之后创建的对象。它是代理类
- 切入点(PointCut):切面通知 执行的 “地点”的定义。
- 连接点(JointPoint):与切入点匹配的执行点。
SpringAOP中,通过Advice可以定义横切逻辑,支持5种类型
通知类型 | 连接点 | 实现接口 |
---|---|---|
前置通知 | 方法前 | org.springframework.aop.MethodBeforeAdvice |
后置通知 | 方法后 | org.springframework.aop.AfterReturningAdvice |
环绕通知 | 方法前后 | org.aopalliance.intercept.MethodInterceptor |
异常抛出通知 | 方法抛出异常 | org.springframework.aop.ThrowsAdvice |
引介通知 | 类中添加新的方法属性 | org.springframeword.aop.IntroductionInterceptor |
使用Sping实现Aop需要导入一个依赖包
<dependencies>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
</dependencies>
一、通过 Spring API 接口实现
- 编写抽象角色与真实角色
//抽象角色
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
//真实角色
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("添加用户");
}
public void delete() {
System.out.println("删除用户");
}
public void update() {
System.out.println("修改用户");
}
public void query() {
System.out.println("查询用户");
}
}
- 编写日志
编写两个日志, 前置增强与后置增强
//前置增强
public class log implements MethodBeforeAdvice {
//method: 要执行的目标对象方法
//args:参数
//target: 目标对象
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.