假设我们有一个课程:
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
然后,我们创建了此类的对象(或者其他一些框架也创建了此类的实例)。
MyClass obj = new MyClass();
是否仍然可以注入依赖项?就像是:
applicationContext.injectDependencies(obj);
(我认为Google Guice有这样的内容)
假设我们有一个课程:
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
然后,我们创建了此类的对象(或者其他一些框架也创建了此类的实例)。
MyClass obj = new MyClass();
是否仍然可以注入依赖项?就像是:
applicationContext.injectDependencies(obj);
(我认为Google Guice有这样的内容)
Answers:
您可以使用的autowireBean()
方法执行此操作AutowireCapableBeanFactory
。您将其传递给一个任意对象,Spring会像对待它自己创建的对象一样对待它,并将应用各种自动装配零碎的零件。
要掌握AutowireCapableBeanFactory
,只需自动连线即可:
private @Autowired AutowireCapableBeanFactory beanFactory;
public void doStuff() {
MyBean obj = new MyBean();
beanFactory.autowireBean(obj);
// obj will now have its dependencies autowired.
}
code
private @Autowired AnotherBean bean;公共无效doStuff(){MyBean obj = new MyBean(bean); } code
。似乎与所有这些注释一样,人们真的很困惑,只是从第一天开始就没有使用Java SDK中的基本模式。:(
您还可以使用@Configurable批注标记MyClass:
@Configurable
public class MyClass {
@Autowired private AnotherClass instance
}
然后在创建时它将自动注入其依赖项。您还应该<context:spring-configured/>
在应用程序上下文中具有xml。
<context:spring-configured/>
吗?
我想分享遵循@ glaz666 答案中提到的@Configurable
方法的解决方案,因为briefly
Spring Neo4j & Aop starts
(无论如何都不相关)Spring Boot
准备使用@Configurable
方法实例化Bean (使用ApplicationRunner
)我需要按照以下步骤操作
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
放置在你的上面Bean
是手动实例化。在我的情况下Bean
,要手动实例化的具有@Autowired
服务,因此是上述注释的支持。XXXApplicaiton.java
(即标注有或文件@SpringBootApplication
含)@EnableSpringConfigured
和@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
compile('org.springframework.boot:spring-boot-starter-aop')
然后compile('org.springframework:spring-aspects:5.0.7.RELEASE')
Bean
并@Configurable
在任何地方添加注释,并且其依赖项应自动装配。*关于上面的第3点,我知道org.springframework.boot:spring-boot-starter-aop
传递性地拉了spring-aop
(如mavencentral所示),但是,在我的情况下,Eclipse无法解析@EnableSpringConfigured
注释,因此,为什么我spring-aop
在启动程序之外显式添加了依赖项。如果您遇到相同的问题,只需声明依赖项或继续探索
org.springframework.context.annotation.aspect.*
不可用