我使用Spring Boot MVC应用程序。我有一个@Configuration
类,它使用@Bean
将bean初始化为ApplicationContext
。我有一个@Controller
类,我试图使用@Autowired
注释自动连接bean。
Result: @Autowired
field is 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);
}
}
我找到了两种解决方法。这两种解决方案都奏效了:1. 使用@Resource代替@Autowired将bean注入到控制器中。2. 在Configuration类中用@Bean注释的方法上使用@PostConstruct。
注意:你不必做这两项更改。