2008-11-21 89 views
49

我是我公司產品的最終用戶。它不太適合集成到Spring中,但是我能夠獲取上下文的句柄並按名稱檢索所需的bean。然而,我仍然想知道是否可以向這個類中注入一個bean,儘管這個類不是由Spring自己管理的。說明:管理某些類MyClass的生命週期的同一個應用程序也在管理Spring上下文的生命週期。 Spring沒有任何有關MyClass實例的知識,並且我想介紹一下如何將實例提供給上下文,但不能在上下文本身中創建實例。向Spring管理的上下文中注入Bean

+0

請澄清一下:您想通過Spring配置,Spring動態地在運行時注入bean,還是通過setter方式編程? – 2008-11-21 21:45:06

+0

任何方法都可以。關鍵是應用程序已經創建了我想要注入一個bean的對象,所以原始對象不由Spring上下文管理。 – 2008-11-21 22:01:21

+0

另外,可以考慮使用一個工廠方法,所以你可以把班級分成應用程序上下文並將其配置爲每一個普通的Spring bean。查看關於bean工廠的Spring參考文檔。 – cletus 2008-11-22 00:54:25

回答

50

你可以ñ做到這一點:

ApplicationContext ctx = ... 
YourClass someBeanNotCreatedBySpring = ... 
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
    someBeanNotCreatedBySpring, 
    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true); 

您可以使用@Autowired等內YourClass指定字段注入等

2

假設u有以下依賴關係鏈:

A - >乙 - 「ç - > X - >ý - >ž

A,B,C被彈簧管理豆類(構建和Spring框架manged) x,y是由應用程序構造非常簡單的POJO,無彈簧輔助

現在

,如果你想使y將獲得到Z利用彈簧的參考,你需要有一個'處理'到春季ApplicationContext

一個辦法就是實現ApplicationContextAware接口。在這種情況下,我會建議A,B或C將實現此接口,並將applicationContext引用存儲在靜態成員中。

所以讓我們例如C級:

class C implmenets ApplicationContextAware{ 
    public static ApplicationContex ac; 
    void setApplicationContext(ApplicationContext applicationContext) { 
       ac = applicationContext; 
    } 
............. 
} 

現在,Y類,你應該有:

(Z)(C.ac.getBean("classZ")).doSomething() 

HTH - Yonatan

1

搜索自動裝配無休止的連擊注入Spring Bean注入POJO了ApplicationContextAware beanaware等圍住我回到這裏,但這沒有爲我提供一個完整的解決方案。

這是一個更好的實施/教程這個國際海事組織: 我希望它可以幫助每個人喜歡它終於幫助了我。

Accessing Spring Beans from outside Spring Context

1

的一種方式,儘管其製造是外部帶來一個bean到Spring是使用標記爲@Configuration Bean,它有一個方法(標有@Bean)一個輔助類,實際上使該實例並通過Spring將其傳遞回來(此時它的屬性注入和代理生成)。

我不太清楚你所需要的範圍;與prototype,你會在每個地方得到一個新鮮的豆。

@Configuration 
public class FooBarMaker { 
    @Bean(autowire = Autowire.BY_TYPE) 
    @Scope("prototype") 
    public FooBar makeAFooBar() { 
     // You probably need to do some more work in here, I imagine 
     return new FooBar(); 
    } 
} 

您可以將生產所需的屬性注入到@Configuration bean中。如果你想創建一個對象 Spring上下文,並提供用於注射該對象到(我用它來創造一個類實例的名稱在運行時定義的接口的實例。)

0

其他豆類是在Spring上下文是,您可以按照this article步驟。

基本上,你創建一個父應用程序上下文,並把你的外部對象到作爲一個單此父上下文。然後,您創建主應用程序上下文(例如,從xml文件),並將父應用程序上下文作爲其父項。

Object externalObject = ... 
GenericApplicationContext parent = new StaticApplicationContext(); 
parent.getBeanFactory().registerSingleton("externalObject", externalObject); 
parent.refresh(); 
ApplicationContext appContext = new ClassPathXmlApplicationContext(... , parent);