2013-03-22 70 views
15

使用Jersey Rest的我希望Jersey篩選器能夠訪問一些spring bean。在Spring beans中使用proxy-target-class =「true」

然而,正如我從其他線程發現的,如果Jersey代碼是Java代理而不是生成的java代理,那麼它不會獲得Spring bean。我想添加代理目標類=「true」

這樣做的影響是什麼,也可以只在單個bean上設置,還是需要在所有引用的bean上設置?

回答

22

通過設置proxy-target-class="true"您將使用CGLIB2代替您的代理,而不是jdk proxys。

的含義有以下幾種,如DE documentation描述:

  • final方法不能被通知,因爲它們不能被覆寫。

  • 您需要在您的類路徑中使用CGLIB 2二進制文件,而JDK提供了動態代理。當它需要CGLIB並且類路徑中找到的CGLIB庫類不是 時,Spring將自動發出警告。

  • 代理對象的構造函數將被調用兩次。這是CGLIB代理模型的自然結果,即爲每個代理對象生成子類 。對於每個代理實例,將創建兩個 對象:實際代理對象和實現該建議的 子類的實例。使用JDK代理時,此行爲未被展示 。通常,兩次調用代理類型的構造函數不是一個問題,因爲通常只有 賦值發生,並且 構造函數中沒有實現真正的邏輯。

另外,你應該能夠做一個「目標 - 代理」特定組件的使用

proxyMode=ScopedProxyMode.TARGET_CLASS 
+1

注意這是一個錯誤創建一個AOP的範圍代理的一個singleton bean。 – 2013-03-22 11:00:34

+0

這是一個例子。編輯以避免混淆。 – gargc 2013-03-22 11:19:30

+0

但我如何將它設置在一個bean上?例如這將會失敗,抱怨代理目標引用 – cduggan 2013-03-22 11:45:34

12

強制CGLIB的代理,但控制器正式實現一個接口(SpringBoot與Spring 4.1.6.RELEASE 1.2.3.RELEASE):

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

這使得有效和工作@RequestMapping和@Transactional註解

4

在Java中使用Spring配置類以下注釋:

@EnableAspectJAutoProxy(proxyTargetClass =真)

+0

哦,它很酷.........你保存了我@ rcde0 – pk4393 2017-05-29 11:57:31