我正在使用 Jersey Rest 并希望 Jersey 过滤器能够访问一些春豆。
但是,正如我从其他线程中发现的那样,如果它们是 Java 代理而不是生成的 Java 代理,Jersey 不会获得 Spring bean。我想添加 proxy-target-class="true"
这样做有什么影响,也可以只在单个 bean 上设置还是需要在所有引用的 bean 上设置?
通过设置proxy-target-class="true"
,您将使用CGLIB2
您的代理,而不是 jdk 代理。
如文档中所述,含义如下:
不能建议最终方法,因为它们不能被覆盖。
您将需要类路径中的 CGLIB 2 二进制文件,而动态代理可用于 JDK。当 Spring 需要 CGLIB 并且在类路径中找不到 CGLIB 库类时,Spring 会自动警告您。
代理对象的构造函数将被调用两次。这是 CGLIB 代理模型的自然结果,其中为每个代理对象生成一个子类。对于每个代理实例,都会创建两个对象:实际的代理对象和实现通知的子类的实例。使用 JDK 代理时不会出现此行为。通常,调用代理类型的构造函数两次不是问题,因为通常只有赋值发生,构造函数中没有实现真正的逻辑。
此外,您应该能够通过使用为特定组件制作“目标代理”
proxyMode=ScopedProxyMode.TARGET_CLASS
尽管控制器正式实现了接口(SpringBoot 1.2.3.RELEASE 和 Spring 4.1.6.RELEASE),但强制使用 CGLib-Proxy:
@Controller
@Scope( proxyMode = ScopedProxyMode.TARGET_CLASS )
public class ServiceImpl implements ServiceIntf
{ .... }
这将启用有效且有效的 @RequestMapping 和 @Transactional 注释
在 Java Spring Config 类中使用以下注解:
@EnableAspectJAutoProxy(proxyTargetClass = true)