对Spring bean使用proxy-target-class =“true”

时间:2013-03-22 10:30:05

标签: spring jersey

我正在使用泽西休息,并希望泽西过滤器可以访问一些春豆。

然而,正如我从其他线程中发现的那样,如果它们是Java代理而不是生成的Java代理,则Jersey不会获得Spring bean。我想添加proxy-target-class =“true”

这样做有什么影响,这只能在一个bean上设置,还是需要在所有引用的bean上设置?

3 个答案:

答案 0 :(得分:28)

通过设置proxy-target-class="true",您将使用CGLIB2作为代理,而不是使用jdk代理。

如de documentation

所述,其含义如下
  
      
  • 无法建议最终方法,因为它们无法覆盖。

  •   
  • 您需要在类路径上使用CGLIB 2二进制文件,而JDK可以使用动态代理。春天会自动的   当需要CGLIB并且CGLIB库类不需要时警告你   在类路径上找到。

  •   
  • 代理对象的构造函数将被调用两次。这是CGLIB代理模型的一个自然结果,即子类   为每个代理对象生成。对于每个代理实例,两个   创建对象:实际代理对象和实例   实现建议的子类。没有表现出这种行为   使用JDK代理时。通常,调用构造函数   代理类型两次,不是问题,因为通常只有   任务发生,并没有实现真正的逻辑   构造

  •   

此外,您应该能够使用

为特定组件制作“目标代理”
proxyMode=ScopedProxyMode.TARGET_CLASS

答案 1 :(得分:18)

强制CGLib-Proxy虽然控制器正式实现了一个接口(SpringBoot 1.2.3.RELEASE with Spring 4.1.6.RELEASE):

@Controller
@Scope( proxyMode = ScopedProxyMode.TARGET_CLASS )
public class ServiceImpl implements ServiceIntf
{ .... }

这样可以启用有效且有效的@RequestMapping和@Transactional注释

答案 2 :(得分:6)

在Java Spring Config类中使用以下注释:

  

@EnableAspectJAutoProxy(proxyTargetClass = true)