Spring混合配置時,遇到配置文件路徑NotFound,使用PathMatchingResourcePatternResolver解決


在將spring的xml配置改為java配置的過程中,遇到了一些問題,block時間比較長的一個問題是資源(.xml, .properties)的路徑找不到,最后是使用PathMatchingResourcePatternResolver解決的。

背景:Spring+MyBatis

入口:

@Configuration
@Import({
        DalConfig.class
        XXDBConfig.class
})
@ImportResource(locations = {"classpath*:spring/applicationContext.xml", "classpath*:spring-dao/applicationContext.xml"})
public class Config {
    @Bean
    public PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver(){
        return new PathMatchingResourcePatternResolver();
    }
}

DalConfig 

@Configuration
public class DalConfig {
    @Bean
    public DalDataSourceFactory xxDalDataSource() {
        return new DalDataSourceFactory();
    }

    @Bean
    public PropertyPlaceholderConfigurer configBean(
            PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver) throws IOException {
        List<Resource> 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 = new PropertyPlaceholderConfigurer();
        propertyPlaceholderConfigurer.setLocations(resources.toArray(new Resource[resources.size()]));
        propertyPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
        return propertyPlaceholderConfigurer;
    }
}

XXDBConfig

@Configuration
public class XXDBConfig {

    @Bean
    public DataSource dataSourceXXXDB(
            @Value("${DBDataCenter}") String dbDataCenter,
            @Value("${CFX_DataSource_ServiceUrl}") String cfxDataSourceServiceUrl,
            @Value("${app.id}") String appId,
            DalDataSourceFactory xxxDalDataSource) throws Exception {
        return xxxxDalDataSource.createDataSource(
                "xxx" + dbDataCenter,
                cfxDataSourceServiceUrl,
                appId);
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryXXXDB(
            DataSource dataSourceXXXDB,
            PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver) throws IOException {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceXXXDB);
        sqlSessionFactoryBean.setMapperLocations(
                pathMatchingResourcePatternResolver.getResources("classpath:com/xx/xxxdb/mapper/**/*.xml") //**表示迭代查找
        );
        return sqlSessionFactoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurerXXXDB() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        return mapperScannerConfigurer;
    }
}

 Test

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=Config.class)
public class DBConfigTest {
    @Autowired
    private ApplicationContext ctx;

    @Autowired
    private Environment env;

    @Test
    public void checkXXXDB(){
        MapperScannerConfigurer mapperScannerConfigurerXXXDB = (MapperScannerConfigurer)ctx.getBean("mapperScannerConfigurerXXXDB");
        assertNotNull(mapperScannerConfigurerXXXDB);

    }

}

 由於不同db的代碼在一個jar里,通過配置來實現按需初始化db連接

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Conditional(DBConfigLoadCondition.class)
public @interface DBConfigLoadConditional {
    String value();
}
public class DBConfigLoadCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if (context.getEnvironment() != null) {
            MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(DBConfigLoadConditional.class.getName());
            if (attrs != null) {
                Properties properties = getProperties();
                String strDBList = properties.getProperty("db.list");
                if(strDBList != null){
                    String[] arrDBList = strDBList.split(",");
                    String condition = (String)attrs.getFirst("value");
                    if(condition == null){
                        return true;
                    }
                    for(String db : arrDBList){
                        if(db != null && db.trim().equalsIgnoreCase(condition)){
                            return true;
                        }
                    }
                }
            }
        }

        return false;
    }

    private Properties getProperties() {
        Properties pro = new Properties();
        try{
            pro.load(DBConfigLoadCondition.class.getResourceAsStream("/META-INF/app.properties"));
        }catch (IOException ex){
            ex.printStackTrace();
        }
        return pro;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM