Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许你定义横切关注点,如日志记录、事务管理、性能监控等,然后将这些关注点注入到应用程序的各个模块中,无需修改这些模块的源代码。
Spring AOP 基于代理模式实现,主要有两种方式:JDK动态代理和CGLIB代理。当目标对象实现了接口时,Spring会使用JDK动态代理;当目标对象没有实现接口时,Spring会使用CGLIB代理。
下面是一个简单的Spring AOP例子,使用AspectJ注解来声明切面和通知:
- 添加依赖(在pom.xml中):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 创建一个切面(Aspect):
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogAspect {
@Pointcut("execution(* com.example.service.*.*(..))") // 定义切点
public void serviceLog() {}
@Before("serviceLog()") // 前置通知
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature());
}
@After("serviceLog()") // 后置通知
public void afterMethod(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature());
}
}
- 创建一个服务(Service):
package com.example.service;
@Service
public class MyService {
public void doSomething() {
System.out.println("Doing something in MyService");
}
}
在上述例子中,我们定义了一个切面LogAspect
,它会在com.example.service
包下所有方法执行前后打印日志。@Pointcut
定义了切点,即哪些方法会被AOP代理,并应用切面逻辑。@Before
和@After
分别表示前置通知和后置通知,在目标方法执行前后调用。
确保Spring Boot应用的主类上添加了@EnableAspectJAutoProxy
注解,以启用Spring AOP支持。
这只是Spring AOP的简单介绍和代码示例,实际应用中可以使用不同的通知类型,如@Around
(环绕通知)、@AfterReturning
(后置返回通知)、@AfterThrowing
(异常抛出通知)等,并且可以更复杂的切点表达式来精确指定哪些方法会被通知。
评论已关闭