如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot教程4——@Scope注解

Spring Boot实战 Spring常用配置

如何配置RabbitMQ(在Spring Boot 2.x中),以便手动确认工作

如何使用 JOOQ 和 Spring-boot 2.0 进行手动事务管理?

如何在不从 spring-boot-starter-web 继承的情况下在 Spring Boot 中获取 ObjectMapper 实例?

Spring Boot入门