如何在Spring中将依赖项注入自我实例化的对象?

问题

假设我们有一个班级:

public class MyClass {
    @Autowired private AnotherBean anotherBean;
}

然后我们创建了这个类的对象(或者其他一些框架创建了这个类的实例)。

MyClass obj = new MyClass();

是否仍然可以注入依赖项?就像是:

applicationContext.injectDependencies(obj);

(我认为Google Guice有这样的东西)


#1 热门回答(153 赞)

你可以使用172449291的autowireBean()方法执行此操作。你将它传递给一个任意对象,Spring将它视为它自己创建的东西,并将应用各种自动装配的零碎。

要掌握AutowireCapableBeanFactory,只需自动装配:

private @Autowired AutowireCapableBeanFactory beanFactory;

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

#2 热门回答(18 赞)

你还可以使用@Configurable注释标记MyClass:

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

然后在创建时它将自动注入其依赖项。你还应该在应用程序上下文xml中包含<context:spring-configured/>


#3 热门回答(2 赞)

刚刚得到了相同的需求,在我的情况下,它已经是非Spring可管理的java类中的逻辑,它可以访问ApplicationContext。灵感来自脚手架。解决方法:

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);