栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@Configuration配置类注入Bean为null

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@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
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489932.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号