以前经常在@Configuration注解的配置类中使用@Autowired注入依赖的Bean,像下面这样
@Configuration public class IotServerConfig { @Autowired SocketClientManager clientManager; @Value("${iot.tcp.port}") private Integer port; @Bean public IotServer iotServer(){ //do something ListallClients = clientManager.getAllClients(); return null; } }
一直相安无事的度过了很多年,一直默默的按照这个模式coding,突然有一天告诉我@Autowired注入的Bean为null,报了一个空指针,世界观崩塌了呀。于是乎到Spring的官网看了看文档,找到如下一段描述(Core Technologies)
用我的蹩脚英语看了看,大概意思是说:”@Configuration类最终只是容器中的一个bean:意味着它可以像普通Bean一样利用@Autowired和@Value注入“,但黄色的一段又说了这种方式可能会导致意外的初始化,八成就是我现在遇到的这种情况。它也提供了一些其他注入依赖的办法
一、构造器注入@Configuration public class RepositoryConfig { private final DataSource dataSource; public RepositoryConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean public AccountRepository accountRepository() { return new JdbcAccountRepository(dataSource); } }
它能保证你拿到的依赖Bean是被始化后的,我想这也是为什么一些开发标准都推荐使用spring时使用构造器注入的原因吧。
二、使用@import把依赖的Bean纳入spring容器的管理
@Configuration @import({ServiceConfig.class, RepositoryConfig.class}) public class SystemTestConfig { @Bean public DataSource dataSource() { // return new DataSource } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)