在将spring的xml配置改为java配置的过程中,遇到了一些问题,block时间比较长的一个问题是资源(.xml, .properties)的路径找不到,最后是使用PathMatchingResourcePatternResolver解决的。
背景:Spring+MyBatis
入口:
@Configuration
@Import({
DalConfig.classXXDBConfig.class})
@ImportResource(locations= {"classpath*:spring/applicationContext.xml", "classpath*:spring-dao/applicationContext.xml"})public classConfig {
@BeanpublicPathMatchingResourcePatternResolver pathMatchingResourcePatternResolver(){return newPathMatchingResourcePatternResolver();
}
}
DalConfig
@Configurationpublic classDalConfig {
@BeanpublicDalDataSourceFactory xxDalDataSource() {return newDalDataSourceFactory();
}
@BeanpublicPropertyPlaceholderConfigurer configBean(
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver)throwsIOException {
List resources = new ArrayList<>();
resources.addAll(Arrays.asList(pathMatchingResourcePatternResolver.getResources("classpath*:config.properties")));
resources.addAll(Arrays.asList(pathMatchingResourcePatternResolver.getResources("classpath*:/META-INF/app.properties")));
PropertyPlaceholderConfigurer propertyPlaceholderConfigurer= newPropertyPlaceholderConfigurer();
propertyPlaceholderConfigurer.setLocations(resources.toArray(newResource[resources.size()]));
propertyPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(true);returnpropertyPlaceholderConfigurer;
}
}
XXDBConfig
@Configurationpublic classXXDBConfig {
@BeanpublicDataSource dataSourceXXXDB(
@Value("${DBDataCenter}") String dbDataCenter,
@Value("${CFX_DataSource_ServiceUrl}") String cfxDataSourceServiceUrl,
@Value("${app.id}") String appId,
DalDataSourceFactory xxxDalDataSource)throwsException {returnxxxxDalDataSource.createDataSource("xxx" +dbDataCenter,
cfxDataSourceServiceUrl,
appId);
}
@BeanpublicSqlSessionFactoryBean sqlSessionFactoryXXXDB(
DataSource dataSourceXXXDB,
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver)throwsIOException {
SqlSessionFactoryBean sqlSessionFactoryBean= newSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSourceXXXDB);
sqlSessionFactoryBean.setMapperLocations(
pathMatchingResourcePatternResolver.getResources("classpath:com/xx/xxxdb/mapper/**/*.xml") //**表示迭代查找
);returnsqlSessionFactoryBean;
}
@BeanpublicMapperScannerConfigurer mapperScannerConfigurerXXXDB() {
MapperScannerConfigurer mapperScannerConfigurer= newMapperScannerConfigurer();returnmapperScannerConfigurer;
}
}
Test
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=Config.class)public classDBConfigTest {
@AutowiredprivateApplicationContext ctx;
@AutowiredprivateEnvironment env;
@Testpublic voidcheckXXXDB(){
MapperScannerConfigurer mapperScannerConfigurerXXXDB= (MapperScannerConfigurer)ctx.getBean("mapperScannerConfigurerXXXDB");
assertNotNull(mapperScannerConfigurerXXXDB);
}
}