假设我们有一个班级:
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
然后我们创建了这个类的对象(或者其他一些框架创建了这个类的实例)。
MyClass obj = new MyClass();
是否仍然可以注入依赖项?类似的东西:
applicationContext.injectDependencies(obj);
(我认为Google Guice有这样的东西)
答案 0 :(得分:169)
您可以使用autowireBean()
的{{1}}方法执行此操作。你将它传递给一个任意对象,Spring将它视为它自己创建的东西,并将应用各种自动装配的零碎。
要掌握AutowireCapableBeanFactory
,只需自动启用:
AutowireCapableBeanFactory
答案 1 :(得分:18)
您还可以使用@Configurable注释标记MyClass:
@Configurable
public class MyClass {
@Autowired private AnotherClass instance
}
然后在创建时它将自动注入其依赖项。您还应该在应用程序上下文xml中有<context:spring-configured/>
。
答案 2 :(得分:2)
得到了同样的需求,在我的情况下,它已经是非Spring可管理的java类中的逻辑,它可以访问ApplicationContext
。受到脚手架的启发。
解决方法:
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
答案 3 :(得分:2)
我想与@ glaz666 answer中提到的@Configurable
一样遵循briefly
方法的解决方案,因为
Spring Neo4j & Aop starts
的Spring Boot 2.0.3(无论如何都无关紧要)Spring Boot
方法(使用@Configurable
)ApplicationRunner
准备好实例化Bean 为了使其正常运行,我需要按照以下步骤操作
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
放在要手动实例化的Bean
之上。在我的情况下,要手动实例化的Bean
具有@Autowired
服务,因此是上述注释的支撑。 XXXApplicaiton.java
和@SpringBootApplication
注释Spring Boot的主@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.*
不可用答案 4 :(得分:0)
我使用了不同的方法。我有弹簧加载的 bean,我想从创建自己线程的第三方库的扩展类中调用它们。
在非托管类中:
{
[...]
SomeBean bc = (SomeBean) SpringContext.getBean(SomeBean.class);
[...]
bc.someMethod(...)
}
然后作为主应用程序中的辅助类:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContext implements ApplicationContextAware
{
private static ApplicationContext context;
public static <T extends Object> T getBean(Class<T> beanClass)
{
return context.getBean(beanClass);
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException
{
SpringContext.context = context;
}
}
答案 5 :(得分:-4)
并非没有一些解决方法,因为Spring对此实例一无所知。
真正的问题是:为什么要创建一个类的实例,您希望手动注入依赖项,而不是让Spring控制它?为什么使用MyClass
的班级注入了MyClass
?