• 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;
        }
    }
  • 相关阅读:
    【MySQL】MySQL主从库配置和主库宕机解决方案
    【MySQL】局域网内:在一台电脑访问另一台电脑的mysql数据库
    【TP5.0】tp5.0实现连接多个数据库,实现类似3.2M(‘table’,'prefix_','db_config2')的CURD操作
    【转载】Mysql主从复制、和MySQL集群(主主复制)
    (转载)【TP5.0】设置session有效时长+修改默认存储路径
    【php+js】用PHP或者JS怎么显示搜索到的关键字高亮,及其文章里包含关键字的一小段
    【Mysql】php执行脚本进行mysql数据库 备份和还原
    【jquery】ajax 动态 改变 select下拉框选中的值
    【TP5.0】model的操作方法
    【php导出pdf文件】php将html 导出成pdf文件(MPDF60),支持完美分页,注意是完美!!
  • 原文地址:https://www.cnblogs.com/liqipeng/p/6833414.html
Copyright © 2020-2023  润新知