Spring配置类@Autowired注入其他配置类时初始化失败问题咨询
问题原因
代码运行失败核心是触发了Spring Bean生命周期的执行顺序冲突:
- 类的实例字段初始化逻辑是在构造函数执行阶段同步运行的,而
@Autowired标记的字段注入,是在Bean实例创建完成(构造函数执行结束)之后,Spring才会完成依赖注入。你在声明simpleRetryPolicy字段时直接调用retryConfiguration.getcount(),这个时间点retryConfiguration还没被注入,值为null,直接触发空指针导致启动失败。 - 额外排查点:如果
RetryConfig类没有加@Configuration/@Component等让Spring托管的注解,Spring根本不会处理类内部的@Autowired注入逻辑,retryConfiguration会一直为null。
正确实现方式
根据使用场景选下面任意一种写法即可:
1. 构造器注入(Spring官方推荐,支持字段final修饰)
构造器注入会保证实例化当前类之前先完成RetryConfiguration的依赖注入,再执行构造方法内的初始化逻辑,不会出现空指针问题:
@Configuration public class RetryConfig { private final SimpleRetryPolicy simpleRetryPolicy; public RetryConfig(RetryConfiguration retryConfiguration) { this.simpleRetryPolicy = new SimpleRetryPolicy(retryConfiguration.getcount()); } }
2. @PostConstruct初始化
如果习惯字段注入,可以新增一个初始化方法,用@PostConstruct标记,Spring会在所有依赖注入完成后自动执行这个方法完成对象初始化:
@Configuration public class RetryConfig { @Autowired private RetryConfiguration retryConfiguration; private SimpleRetryPolicy simpleRetryPolicy; @PostConstruct private void init() { this.simpleRetryPolicy = new SimpleRetryPolicy(retryConfiguration.getcount()); } }
注意:这种写法下simpleRetryPolicy不能加final修饰,因为需要在初始化方法里完成赋值。
3. @Bean方式注册(配置类最常用写法)
如果SimpleRetryPolicy需要在其他业务类中注入使用,直接把它注册成容器Bean最方便:
@Configuration public class RetryConfig { @Bean public SimpleRetryPolicy simpleRetryPolicy(RetryConfiguration retryConfiguration) { return new SimpleRetryPolicy(retryConfiguration.getcount()); } }
内容的提问来源于stack exchange,提问作者ashu
相关产品推荐
相关产品推荐

