背景

  • Spring实际项目中是不是经常要用SpringUtils.getBean(xxx.getClass())来获取代理对象,有的时候又不想走代理对象,那么这种情况要怎么处理呢
  • 其实Spring提供了RawTargetAccess类来处理这个问题

实现

  • 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 可代理BEAN访问者接口(支持获取代理的真实对象、获取代理对象)
*/
public interface ProxyableBeanAccessor <T extends ProxyableBeanAccessor> extends RawTargetAccess {

/**
* 获取代理的真实对象(即:未被代理的对象)
* 注:若调用未被代理的bean的公开方法,则均不会再走AOP切面
*
* @return 未被代理的对象Bean
*/
default T getReal() {
return (T) this;
}

/**
* 获取当前类的代理对象(即:已被代理的对象)
* 注:若调用已被代理的对象Bean的公开方法,则相关AOP切面均可正常拦截与执行
*
* @return 已被代理的对象Bean
*/
default T getProxy() {
return (T) SpringUtils.getBean(this.getClass());
}

}

总结

  • 使用方法:只需将原来Service的子类或其它可能被切面代理的类 加上实现自ProxyableBeanAccessor即可,然后在这个类里面或外部调用均可通过getReal获得原生对象、getProxy获得代理对象

参考