我在项目中使用spring security注释。有些情况下,我想调用带注释对象的无安全版本。默认情况下,Spring会为注释对象创建一个启用安全性的代理,并将其用于代码中的自动装配,有什么办法可以使用spring实现这一点吗? 一个显而易见的方法是手动创建对应于每个类的代理类,我希望这个特性对这些方法进行注释,并且这些方法的实现只是将它委托给实际的对象。
答案 0 :(得分:0)
作为JDK代理的一个选项,您可以在运行时获取实际的bean:
MyBean proxy;
if(AopUtils.isJdkDynamicProxy(proxy)) {
MyBean actualInstance = (MyBean) ((Advised)proxy).getTargetSource().getTarget()
}
actualInstance.doSomethingSecured(); // no advice related to this method will be called
// so your security annotation will be ignored (transactions, cache, and everething that requires AOP too...)
但从架构的角度来看,使用手动代理的方法看起来不那么错误(除非你绝对确定你不需要安全性和所有其他可能的方面)。
您可以使用泛型来提高可读性:
MyBean actualInstance = extractProxyTarget(proxy, proxy.getClass());
actualInstance.doSomethingSecured();