簡體   English   中英

Spring:如何手動注入不受實際應用程序管理的bean?

[英]Spring : How to inject manually a bean which is not managed by actual application?

這里的上下文:

  • 我們有一個Java庫,這是工廠代碼。
  • 該庫直接部署在Tomcat上
  • 應用程序“ A”,“ B”和“ C”使用此庫(jar)進行編譯,它是Tomcat上的已部署版本,當應用程序調用它時使用。

在庫中,我們有以下軟件包:-old.service-old.service.impl-new.service-new.service.impl

舊服務是一些帶有二傳手的經典類。 它是在應用程序“ A”的XML配置中聲明的spring bean。

在新服務中,我們有一個帶有一些@Autowired屬性的帶注釋的類(@Service),以便由在XML配置中具有自動掃描功能的應用程序“ B”和“ C”進行管理。

我們希望更改舊服務的實現,以便使用新服務而不更改應用程序“ A”中的任何內容。 為此,我們可以從舊的類中調用新的類。 但是pb是Spring ......

我們如何實例化新類和@autowired屬性? 我們可以手動實例化舊類中的新類,並通過反射實例化屬性嗎?

謝謝。

ps:java庫中沒有XML配置。

兩種方式:

  1. 在應用程序A中,您實例化old.service.impl,Spring bean將對new.service.impl的引用注入其中

    <bean class =“ old.service.impl”> <屬性名=“ newService” ref =“ newServiceBean” /> </ bean> <bean class =“ new.service.impl” id =“ newServiceBean” />

顯然,這意味着您將必須修改old.service.impl以為“ newService”添加設置器,然后在舊服務的impl代碼中使用它

  1. 直接從Web應用程序上下文獲取“ new.service.impl”引用:

    WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean(newServiceImpl.class);

在這種情況下,您將需要獲取ServletContext。 一種方法是從HttpRequest中獲取它

選項1是首選-您不依賴於在servlet內部運行,並且幾乎不需要更改代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM