Spring-AOP入门案例(注解版)

推荐先阅读Spring全家桶

案例设定:测算接口执行效率.

简化设定:在方法执行前输出当前系统时间。

开发模式:XML or 注解

思路分析:

1.导入坐标(pom.xml)

2.制作连接点(原始操作,Dao接口与实现类)

3.制作共性功能(通知类与通知)

4.定义切入点

5.绑定切入点与通知关系(切面)

实现:

<dependencies>
<!--spring-context依赖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>
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 ...");
}
}
// 定义bean,被spring容器管理
@Component
// 定义当前类为切面类
@Aspect
public class MyAdvice {
// 定义切入点,切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。
@Pointcut("execution(void com.zx.dao.BookDao.update())")
private void pt(){}

// 绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置
@Before("pt()")
public void method(){
System.out.println(System.currentTimeMillis());
}
}
@Configuration
@ComponentScan("com.zx")
// 开启Spring对AOP注解驱动支持
@EnableAspectJAutoProxy
public class SpringConfig {
}
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
bookDao.save();
}
}

知识点1:@EnableAspectJAutoProxy

名称 @EnableAspectJAutoProxy
类型 配置类注解
位置 配置类定义上方
作用 开启注解格式AOP功能

知识点2:@Aspect

名称 @Aspect
类型 类注解
位置 切面类定义上方
作用 设置当前类为AOP切面类

知识点3:@Pointcut

名称 @Pointcut
类型 方法注解
位置 切入点方法定义上方
作用 设置切入点方法
属性 value(默认):切入点表达式

知识点4:@Before

名称 @Before
类型 方法注解
位置 通知方法定义上方
作用 设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行