业务场景:一个接口有多个实现类,在不同的场景下使用不同的实现类,使用配置的方式注入不同的实现类。
@Conditional注解的类型有很多,按需使用。
示例代码:
//配置文件 application.yml
db:
hbase: false
mysql: true
这里使用的@ConditionalOnExpression注解,只有符合条件才会扫描指定的路径。
/**
* 根据配置文件 ${db.hbase} 选择是否使用hbase
* @author hu.caiyun
* @create 2020/6/22
*/
@Configuration
@ComponentScan(value = "com.hcy.test.dao.hbase")
@ConditionalOnExpression(value = "${db.hbase}")
public class HbaseConfig {
}
/**
* 根据配置文件 ${db.mysql} 选择是否使用mysql
* @author hu.caiyun
* @create 2020/6/22
*/
@Configuration
@ComponentScan(value = "com.hcy.test.dao.mysql")
@ConditionalOnExpression(value = "${db.mysql}")
public class MySqlConfig {
}
/**
* 在启动类中配置扫描排除掉实现类所在的包
* @author hu.caiyun
* @create 2020/6/22
*/
@SpringBootApplication
@ComponentScan(excludeFilters =
{
@ComponentScan.Filter(type = FilterType.REGEX,pattern = "com.hcy.test.dao.*")
})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication .class, args);
}
}
示例代码是一个项目兼容多个数据库的实现,目前只能想到这种办法,如果有更好的办法,欢迎指教。