【问题标题】:Spring @Bean method executing after @Autowired在@Autowired 之后执行的Spring @Bean 方法
【发布时间】:2017-02-02 00:25:47
【问题描述】:

我使用 Spring Boot MVC 应用程序。 我有一个@Configuration 类,它使用@Bean 将一个bean 初始化为ApplicationContext。 我有一个 @Controller 类,我正在尝试使用 @Autowired 注释将 bean 自动装配到该类中。

结果:@Autowired 字段为 null

DEBUG:我尝试调试以查看执行顺序。我期待看到带有 @Configuration 注释的类将首先运行以将 bean 初始化到应用程序上下文中。但是,控制器类首先被实例化。然后接下来调用配置类的@Bean 方法。由于这个 bean 是在控制器之后实例化的,这就是控制器没有自动装配 bean 的原因。

问题:如何让@Configuration@Bean方法在控制器类实例化之前执行?


配置类代码:

@Configuration
public class RootConfiguration2 {

    @Autowired
    private IService<ActBinding> bindingService;

    @Bean
    public Map<String, String> getBingindNameToRoutingKeyMap() throws Exception {
        ListOperation<ActBinding> operation = ListOperation.from("key", "name", "exchangeId");
        operation.sort("key", SortOrder.Ascending);
        Iterable<ActBinding> result = bindingService.list(operation).getResult();
        Map<String, String> bindingNameToRoutingKey = new HashMap<>();
        result.forEach(x -> bindingNameToRoutingKey.put(x.getName(), x.getKey()));
        return Collections.unmodifiableMap(bindingNameToRoutingKey);
    }
}

【问题讨论】:

  • 能分享一下配置类代码吗?
  • 开启日志并检查警告信息。
  • 您必须显示 IService 的代码以及注入 getBingindNameToRoutingKeyMap 的位置。尽管您没有提到此类错误,但它可能是循环依赖。当注入 getBingindNameToRoutingKeyMap 与 @Autowring(required=false) 配对时,可能会出现拼写错误...需要更多代码。

标签: spring configuration controller javabeans autowired


【解决方案1】:

我找到了两种解决方法。两种解决方案都有效: 1. 使用@Resource 而不是@Autowired 将bean 注入控制器。 2.在Configuration类中用@Bean注解的方法上使用@PostConstruct。

注意:您不必同时进行这两项更改。其中任何一个都应该工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-26
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2021-04-24
    • 2017-05-23
    相关资源
    最近更新 更多