@Configuration配置类注入Bean为null

@Configuration配置类注入Bean为null,第1张

@Configuration配置类注入Bean为null

以前经常在@Configuration注解的配置类中使用@Autowired注入依赖的Bean,像下面这样

@Configuration
public class IotServerConfig {

    @Autowired
    SocketClientManager clientManager;

    @Value("${iot.tcp.port}")
    private Integer port;

    @Bean
    public IotServer iotServer(){
        //do something
        List allClients = 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
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5482059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存