SpringBoot 条件注解
Posted *King*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 条件注解相关的知识,希望对你有一定的参考价值。
@Conditional表示仅当所有指定条件都匹配时,组件才有资格注册 。
@Conditional的使用
-
作为任何@Bean方法的方法级注释
-
作为任何类的直接或间接注释的类型级别注释 @Component,包括@Configuration类
-
作为元注释,目的是组成自定义构造型注释
常用的条件注解:
- @Conditional 依赖的条件
- @ConditionalOnBean 在某个Bean存在的条件下
- @ConditionalOnMissingBean 在某个Bean不存在的条件下
- @ConditionalOnClass 在某个Class存在的条件下
- @ConditionalOnMissingClass 在某个Class不存在的条件下
例1:判断当前操作系统
定义接口
SysService
public interface SysService {
String show();
}
定义两个实现类
LinuxService
public class LinuxService implements SysService {
@Override
public String show() {
return "我是Linux系统";
}
}
WindowsService
public class WindowsService implements SysService {
@Override
public String show() {
return "我是Windows系统";
}
}
定义两个条件类
LinuxCondition
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String sysName = context.getEnvironment().getProperty("os.name");
if(sysName.contains("Linux")){
return true;
}
return false;
}
}
WindowsCondition
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String sysName = context.getEnvironment().getProperty("os.name");
if(sysName.contains("Windows")){
return true;
}
return false;
}
}
定义条件配置类
使用@Conditional注解,对象需要实现Condition接口,Condition 接口是一个函数式接口
ConditionConfig
@Configuration
public class ConditionConfig {
@Bean
@Conditional(WindowsCondition.class)
public SysService windowsService(){
return new WindowsService();
}
@Bean
@Conditional(LinuxCondition.class)
public SysService linuxService(){
return new LinuxService();
}
}
测试类:
Test
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);
SysService sysService = context.getBean(SysService.class);
String sysName = context.getEnvironment().getProperty("os.name");
System.out.println("当前的操作系统是:"+sysName);
System.out.println("调用方法打印的系统是:"+sysService.show());
}
}
运行结果:
例2:动态配置mysql或者Oracle数据源
配置文件里配置参数
db-type=oracle
定义Condition类
MySQLCondition
public class MySQLCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return "mysql".equals(context.getEnvironment().getProperty("db-type"));
}
}
OracleConditon
public class OracleConditon implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return "oracle".equals(context.getEnvironment().getProperty("db-type"));
}
}
定义JdbcFactory接口
public interface JdbcFactory {
void create();
}
默认的Mysql和Oracle实现
MySQLFactory
@ConditionalOnMissingBean(value = JdbcFactory.class,ignored = MySQLFactory.class)
@Conditional(MySQLCondition.class)
@Component
public class MySQLFactory implements JdbcFactory{
@Override
public void create() {
System.out.println("I am mysql");
}
}
OracleFactory
@ConditionalOnMissingBean(value = JdbcFactory.class,ignored = OracleFactory.class)
@Conditional(OracleConditon.class)
@Component
public class OracleFactory implements JdbcFactory{
@Override
public void create() {
System.out.println("I am oracle");
}
}
测试
@SpringBootTest
public class Test02 {
@Resource
private JdbcFactory jdbcFactory;
@Test
public void test02(){
jdbcFactory.create();
}
}
");
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/435482730bc54ffd89649dc3d9115229.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA77yKS2luZ--8ig==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
以上是关于SpringBoot 条件注解的主要内容,如果未能解决你的问题,请参考以下文章
难以想象SpringBoot中的条件注解底层居然是这样实现的