记一次Environment注入失败的原因

@PropertySource("classpath:tx.properties")
@Configuration
public class TxConfig {
    public TxConfig() {
        System.out.println("Txconfig-------");
    }

    @Autowired
    private Environment environment;

    @Bean
    public DataSource dataSource() throws Exception {
        Properties props = new Properties();
        props.put(DruidDataSourceFactory.PROP_URL,environment.getProperty("druid.url"));
        props.put(DruidDataSourceFactory.PROP_USERNAME,environment.getProperty("druid.user"));
        props.put(DruidDataSourceFactory.PROP_PASSWORD,environment.getProperty("druid.passwd"));
        return DruidDataSourceFactory.createDataSource(props);
    }
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));
        return sqlSessionFactoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer configurer = new MapperScannerConfigurer();
        configurer.setBasePackage("org.panrd.dao");
        return configurer;
    }
}

运行时Environment注入失败,由于spring在启动时先是实例化BeanDefinitionRegistryPostProcessor,而MapperScannerConfigurer实现了该接口,MapperScannerConfigurer在实例化时使用的事factoryMethod 的方式,所以要先实例化TxConfig,而在TxConfig实例化时,此时容器中hasInstantiationAwareBeanPostProcessors为false,在填充属性的方法populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)会判断hasInstantiationAwareBeanPostProcessors,由于hasInstantiationAwareBeanPostProcessors是false,所以调用不到InstantiationAwareBeanPostProcessor接口的实现类AutowiredAnnotationBeanPostProcessor的后置处理器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值