2010-09-28 104 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);