如何在 Spring Boot 中手动新建实例中使用 @Autowired
Posted
技术标签:
【中文标题】如何在 Spring Boot 中手动新建实例中使用 @Autowired【英文标题】:How to use @Autowired in manually new instance in Spring Boot 【发布时间】:2014-10-27 11:50:24 【问题描述】:众所周知,@Autowired
只能在spring容器管理的实例中使用,如果你新建一个实例,其中的@Autowired
成员不会生效。
但我认为在某些情况下,无法避免新的实例。
比如一个RunnableTask。其中包含由 spring 管理的 DAOService。因为任务是手动新建的。所以我不能在ThreadTask中使用DAOService。
所以我想知道如何在Spring Boot中获取ApplicationContext,这样我就可以通过context.getBean()
获取bean。
我知道在 main() 中我可以自动装配 ApplicationContext。但是我不能到处传递上下文作为参数!
我想在任何地方获取 ApplicationContext。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:使用spring管理的工厂对象怎么样?
class TheBeanYouWant
private Integer beanSupposeToAutowired;
public TheBeanYouWant(Integer bean)
this.beanSupposeToAutowired = bean;
@Component
class TheBeanFactory
@Autowired
private Integer beanAutowired;
public TheBeanYouWant newBean()
return new TheBeanYouWant(beanAutowired);
【讨论】:
而且我看到你有更多不错的内容 - 你可能想在写更多问题时更加小心 --- 另一方面,欢迎“upvote privilege” ;-)【参考方案2】:我想在任何地方获取 ApplicationContext。
这是一种反模式。尽量避免。
为什么不能将DAOService
注入到创建RunnableTask
的东西中?
【讨论】:
因为RunnableTask是我自己创建的,不是Spring管理的。所以@Autowired
不能自动连接。 @戴夫
是的,但是如果你自己创建它就不需要自动装配它,只需将东西注入构造函数(或设置器)。
感谢您的回答,这对我很有用。但是还有一个小问题,我在 CodeReview SE 中问过。你能看一下吗?谢谢。Bean Management in Spring Boot@Dave以上是关于如何在 Spring Boot 中手动新建实例中使用 @Autowired的主要内容,如果未能解决你的问题,请参考以下文章
如何配置RabbitMQ(在Spring Boot 2.x中),以便手动确认工作
如何使用 JOOQ 和 Spring-boot 2.0 进行手动事务管理?
如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?