有一个模块,因底层使用的云平台不同,所以有两个分支分别对应h3c / openstack 云平台环境,但是这样导致难以维护,决定开发兼容两套云平台的sdk后(由其他同事进行完成,对于缺少的接口自行补充),使用该sdk将模块的两个分支进行合并。
openstack分支有一个功能直接对openstack数据库进行了操作,而h3c分支并没有,如果模块切换到h3c环境后该mapperBean没有则会报错。于是使用@Conditional(x.class)注解进行有条件的使用。
如果不是openstack环境则不注入 openstack环境的链接、会话对象,并手动注入一个空实现的mapper对象,这样其他类引入mappper对象就可以找到空实现的mapper对象,然后在其他类做判断如果不是openstack 则抛出异常提示非openstack环境该功能无法使用
- @Configuration
- @MapperScan(basePackages = "com.rs.remote.dao.nova",sqlSessionFactoryRef = "novaSqlSessionFactory")
- @ConditionalOnExpression("'${cloud.type}'.equals('os')")
- public class NovaDataSourceConfig {
-
- @ConfigurationProperties(prefix = "spring.datasource.druid.nova")
- @Bean(name = "novaDataSource")
- public DataSource getDataSource(){
- return DruidDataSourceBuilder.create().build();
- }
-
- @Bean(name = "novaSqlSessionFactory")
- public SqlSessionFactory novaSqlSessionFactory(@Qualifier("novaDataSource") DataSource dataSource) throws Exception {
- SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
- bean.setDataSource(dataSource);
- bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/rs/remote/dao/nova/**/mybatis/*Mapper.xml"));
- bean.setTypeAliasesPackage("com.rs.remote.dao.nova.model");
- return bean.getObject();
- }
- }
- @Bean
- @ConditionalOnExpression("'!${cloud.type}'.equals('os')")
- public InstanceMapper instanceMapper(){
- return new InstanceMapper() {
- @Override
- public void updateHostNameForInstanceByCloudId(String cloudId, String hostName) {
- throw new RuntimeException("非openstack环境,无法使用");
- }
- };