本文已参与「新人创作礼」活动,一起开启掘金创作之路。
AOP
1. AOP核心概念
- Target(目标对象):代理的目标对象
- Proxy(代理):一个类贝AOP植入增强后,就产生一个结果代理类
- Joinpoint(连接点):被拦截到的点(方法),就是可以被增强的方法
- Pointcut(切入点): 指我们要对哪些JoinPoint进行拦截的定义,被增强了的连接点
- Advice(通知,增强) : 拦截到JoinPoint后要做的事情就是通知,封装业务逻辑的方法
- Aspect(切面): 切入点和通知的结合
- Weaving(织入): 将切点和通知结合的过程,理解为织入过程
【开发注意事项】
谁是切点?(切点表达式)
谁是通知?(切面类中的增强方法)
将切点和通知进行织入配置。
2. AOP入门案例
- 导入坐标(pom.xml)
- 制作连接点方法(原始操作,dao接口与实现类)
- 制作共性功能(通知类与通知)
- 定义切入点
- 绑定切入点与通知关系(切面)
step1:导入pom.xml坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--spring依赖,会将spring-aop传进来-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!--切入点表达式的依赖-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
step2:制作连接点方法,就是写个dao接口和一个实现类。
public interface BookDao {
public void save();
public void update();
}
@Component
public class BookDaoImpl implements BookDao{
@Override
public void save() {
System.out.println(System.currentTimeMillis());
System.out.println("book dao save");
}
@Override
public void update() {
System.out.println("book dao update");
}
}
注意这里@Component已经把该实现类注册成bean了。
step3:写通知类和方法
通知类必须配置成spring管理的Bean,用@Component就行。
@Component
public class MyAdvice {
public void method(){
System.out.println(System.currentTimeMillis());
}
}
step4、step5:定义切入点,绑定切入点与通知的关系
绑定方式一:
@Component
//设置当前的类为切面类
@Aspect
public class MyAdvice {
@Pointcut("execution(void com.ydl.dao.BookDao.update())")
private void pt(){}
@Before("pt()")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
绑定方式二:
@Component
//设置当前的类为切面类
@Aspect
public class MyAdvice {
@Before("execution(void com.ydl.dao.BookDao.update())")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
上述代码解释:
@Pointcut注解设置切入点,要求配置在方法上方
@Before设置到前面,设置在切入点pt()的前面运行当前操作(前置通知)
切入点表达式execution(void com.ydl.dao.BookDao.update())
Spring配置类
@Configuration
@ComponentScan("com.ydl")
//注解开发AOP功能
@EnableAspectJAutoProxy
public class SpringConfig {
}
@EnableAspectJAutoProxy开启AOP注解
测试类测试
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bean = ctx.getBean(BookDao.class);
bean.update();
}
}