【Spring Boot】Spring AOP动态代理,以及静态代理
在Spring AOP中,有两种主要的代理方式:静态代理和动态代理。
静态代理:
静态代理是在编译期就确定了代理行为的代理方式。在Spring中,你可以通过@Aspect
注解来定义一个切面(Aspect),然后通过@Before
、@After
等注解来指定在方法执行前后要进行的操作。
动态代理:
动态代理是在运行期动态生成的代理。Spring AOP默认使用的是CGLib动态代理,如果对象实现了接口,Spring会使用JDK动态代理。
示例代码:
// 切面类
@Aspect
@Component
public class LogAspect {
// 前置通知
@Before("execution(* com.example.service.MyService.*(..))")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
// 后置通知
@After("execution(* com.example.service.MyService.*(..))")
public void afterMethod(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
}
// 服务接口
public interface MyService {
void myMethod();
}
// 服务实现类
@Service
public class MyServiceImpl implements MyService {
@Override
public void myMethod() {
System.out.println("My method is executed.");
}
}
在这个例子中,LogAspect
是一个切面,它会在MyService
中所有方法执行前后执行beforeMethod
和afterMethod
方法。这就是一个静态代理的例子,因为代理的行为是在编译期就确定的。
Spring AOP的动态代理通常是隐式的,你不需要手动创建代理对象,Spring会自动在运行时为符合切点表达式的Bean创建代理对象。如果你需要手动获取代理对象,可以使用AopContext
,但这通常不推荐,因为它可能会破坏Spring的依赖注入和生命周期管理。
评论已关闭