1.问题描述
由于自己的mapper没有放在本项目下,而是通过jar包的方式引入进来的,所以需要在启动的时候配置MapperScannerConfigurer,然后指定包路径;为了支持可配置化,将包路径配置在了yml文件中,然后启动容器,结果。。。
2.上代码
配置类
@Configuration
//@MapperScan(basePackages = {"io.db.api.dao"}) // 增加报扫描配置
public class MybatisPlusConfig {
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(@Value("${mybatis.basePackage}") String basePackage) {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage(basePackage);
return mapperScannerConfigurer;
}
}
yml配置文件
mybatis:
basePackage: io.db.api.dao
这里采用@Value("${mybatis.basePackage}")的方式从配置文件中读取包的全路径。
启动报错
java.lang.IllegalArgumentException: Could not resolve placeholder 'mybatis.basePackage' in value "${mybatis.basePackage}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211)
at org.springframework.core.env.AbstractEnvironment.resolveRequiredPlaceholders(AbstractEnvironment.java:575)
.....................................................
很显然,当bean初始化的时候,占位符并没有被解析。
3.源码分析
Spring的解析占位符,是通过PropertySourcesPlaceholderConfigurer这个类来解析的,而PropertySourcesPlaceholderConfigurer继承了BeanFactoryPostProcessor。
关于BeanFactoryPostProcessor官方给出的解释是:操作bean配置元数据。Spring IoC容器允许BeanFactoryPostProcessor读取配置元数据ÿ