大白话:当你对一个类的某一个方法进行了AOP增加,默认情况下,同类的其他方法无法调用增强后的方法,除非你在spring配置文件中设置了expose-proxy="true" ,让这个代理对象暴露在外面。
<aop:aspectj-autoproxy expose-proxy="true" />中的expose-proxy属性允许你通过AOP上下文访问当前目标对象的代理。这在某些特定的场景下非常有用,尤其是当你需要在目标对象内部方法调用中仍然走代理时。
默认情况下,当你在Spring管理的bean中调用本地方法时(即一个方法调用同一个类中的另一个方法),这个调用不会通过代理对象,也就是说,不会应用任何与该调用相关的AOP增强(如事务管理、安全检查等)。这是因为代理是基于拦截外部对bean的调用来工作的,而不是拦截bean内部的方法调用。
设置expose-proxy="true"后,Spring容器会在当前线程上下文中暴露这个bean的代理。这样,你就可以通过AopContext.currentProxy()来获取当前bean的代理,并通过这个代理来调用本地方法,以确保这些调用也能享受到AOP增强的好处。
这个功能在需要在同一个事务上下文中调用当前bean的另一个方法时特别有用,比如在需要确保方法调用应用了事务设置或是其他AOP增强时。
@Service
public class MyService {
public void method1() {
// 这个调用不会通过代理,因此不会应用AOP增强
method2();
// 这个调用会通过代理,因此会应用AOP增强
((MyService) AopContext.currentProxy()).method2();
}
public void method2() {
// 一些逻辑
}
}