为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

陪伴而非守候 2019-10-15 14:11:10

假设我们有一个课程:


public class MyClass {

    @Autowired private AnotherBean anotherBean;

}

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


MyClass obj = new MyClass();

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


applicationContext.injectDependencies(obj);

(我认为Google Guice有这样的内容)


查看完整描述

3 回答

?
萧十郎

您可以使用的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.

}


查看完整回答
反对 回复 2019-10-15
?
ibeautiful

您还可以使用@Configurable批注标记MyClass:


@Configurable

public class MyClass {

   @Autowired private AnotherClass instance

}

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


查看完整回答
反对 回复 2019-10-15
?
holdtom

我想分享遵循@ glaz666 答案中提到的@Configurable方法的解决方案,因为briefly


@skaffman 的答案将近10岁了,这并不意味着不够好或不起作用。

@ glaz666的回答很简短,并没有真正帮助我解决问题,但确实为我指明了正确的方向

我的设定

Spring Boot 2.0.3 with 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)

在构建文件中添加依赖项(即build.gradle或pom.xml,取决于您使用的是哪个),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.*不可用

您的IDE是否设置正确

等等


查看完整回答
反对 回复 2019-10-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信