1、AOP简介
1.1、什么是AOP?
-
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构
-
OOP(Object Oriented Programming)面向对象编程
-
1.2、AOP作用
-
作用:在不惊动原始设计的基础上为其进行功能增强,也可以通过代理模式实现
1.3、AOP核心概念
-
无入侵式/无侵入式
-
连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
-
在SpringAOP中,理解为方法的执行
-
-
切入点(Pointcut):匹配连接点的式子
-
在SpringAOP中,一个切入点可以描述一个具体方法,也可以匹配多个方法
-
连接点范围要比切入点范围打,是切入点的方法也一点是连接点,但是连接点的方法就不一定要被增强,所以可能不是切入点。
-
-
通知(Advice):在切入点处执行的操作,也就是共性功能
-
在SpringAOP中,功能最终以方法的形式呈现
-
-
通知类:定义通知的类
-
切面(Aspect):描述通知与切入点的对应关系
2、AOP入门案例
2.1思路分析
1.导入坐标(pom.xml)
2.制作连接点(原始操作,Dao接口与实现类)
3.制作共性功能(通知类与通知)
4.定义切入点
5.绑定切入点与通知关系(切面)
2.2 环境准备
-
创建一个Maven项目
-
pom.xml添加Spring依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
-
添加BookDao和BookDaoImpl类
public interface BookDao {
public void save();
public void update();
}
@Repository
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println(System.currentTimeMillis());
System.out.println("book dao save ...");
}
public void update(){
System.out.println("book dao update ...");
}
}
-
创建Spring的配置类
@Configuration
@ComponentScan("com.linxin")
public class SpringConfig {
}
2.3、AOP实现步骤
步骤1:添加依赖 pom.xml
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
-
spring-context
中已经导入了spring-aop
,所以不需要再单独导入spring-aop
-
导入AspectJ的jar包,AspectJ是AOP思想的一个具体实现,Spring有自己的AOP实现,但是相比于AspectJ来说比较麻烦,所以我们直接采用Spring整合ApsectJ的方式进行AOP开发。
步骤2:定义通知类和通知
通知就是将共性功能抽取出来后形成的方法
public class MyAdvice {
public void method(){
System.out.println(System.currentTimeMillis());
}
}
步骤3:定义切入点
BookDaoImpl中有两个方法,分别是save和update,我们要增强的是update方法,该如何定义呢?
public class MyAdvice {
@Pointcut("execution(void com.linxin.dao.BookDao.update())")
private void pt(){}
public void method(){
System.out.println(System.currentTimeMillis());
}
}
说明:
-
切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实