2010-09-28 69 views
94

比方說,我們有一個類:如何在Spring中將依賴注入到自實例化的對象中?

public class MyClass { 
    @Autowired private AnotherBean anotherBean; 
} 

然後,我們創建了這個類的一個對象(或一些其他的框架已經創建了這個類的實例)。

MyClass obj = new MyClass(); 

是否有可能仍然注入依賴關係?喜歡的東西:

applicationContext.injectDependencies(obj); 

(我認爲谷歌吉斯有這樣的事)

回答

141

您可以使用AutowireCapableBeanFactoryautowireBean()方法進行此操作。你把它傳遞給一個任意的對象,Spring會把它看作它自己創建的東西,並且會應用各種自動裝配的零件。

要獲得AutowireCapableBeanFactory的保持,只是自動裝配的是:

private @Autowired AutowireCapableBeanFactory beanFactory; 

public void doStuff() { 
    MyBean obj = new MyBean(); 
    beanFactory.autowireBean(obj); 
    // obj will now have its dependencies autowired. 
} 
+0

很好的回答(+1)。還有第二種方法可以影響自動裝配的發生:http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html# autowireBeanProperties%28java.lang.Object,%20int,%20boolean%29 – 2010-09-28 14:29:31

+0

但是,如果我有兩個對象,而第一個自動裝載第二個。 autowire bean factory如何處理案例中的依賴關係? – 2014-01-20 19:25:14

+2

這實際上是一個壞模式。如果這是你真正使用MyBean的原因,那麼爲什麼不用AnotherBean作爲參數來構造函數。就像:'code' private @Autowired AnotherBean bean; public void doStuff(){MyBean obj = new MyBean(bean); }'代碼'。似乎所有這些註釋都讓人感到困惑,並且從第1天開始就不使用java SDK中的基本模式。:( – Denis 2014-04-03 22:25:21

-6

沒有一些解決方法,例如Spring一無所知這個實例。

真正的問題是:爲什麼你要創建一個你想要手動注入依賴的類的實例,而不是讓Spring控制它呢?爲什麼不使用MyClass獲得MyClass註冊的類?

+12

你的答案是不正確的,你的「真正的問題」是一個評論,不是答案。 – 2012-09-10 19:10:28

13

您還可以標記與@Configurable註解你的MyClass的:

@Configurable 
public class MyClass { 
    @Autowired private AnotherClass instance 
} 

然後在創建時,它會自動注入其依賴。您的應用程序上下文xml中也應該有<context:spring-configured/>

+2

Galz666,你的方法看起來更清潔,我想要做什麼。但是我無法讓它工作。我沒有XML文件,我完全使用Java配置。有沒有等同於''? – masstroy 2014-08-30 04:51:23

+0

請參閱http://stackoverflow.com/a/4703781/404615 – 2015-04-08 14:54:32

+0

這是乾淨的解決方案,但需要更多努力:您應該使用加載時編織,如上面顯示的iimuhin所示或將AspectJ編譯器添加到項目。加載時間顧名思義會在運行時造成額外的成本。 – jsosnowski 2015-08-15 14:25:47

0

剛剛得到了相同的需求,在我的情況下,它已經是非Spring可管理的java類的邏輯,它有訪問ApplicationContext的權限。受到腳手的啓發。 要解決:

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); 
factory.autowireBean(manuallyCreatedInstance); 
相關問題