2008-11-21 30 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);