假设我们有一个课程:
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.
}
codeprivate @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.*不可用