[springboot注解 容器篇] @Conditional

@Conditional注解
它是在Spring4.0开始才有的注解。作用就是:只有满足这个条件的bean才会被创建放到容器中。
前面说活,只要在@Configuration的修饰的类中使用@Bean,那么就会bean放到容器中,有了@Conditional后,它与@Bean配合使用,让只有满组条件的bean才会放到容器中。

@Conditional怎么用?
先看源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
	Class<? extends Condition>[] value();
}

首先,源码告诉我们@Conditional注解可以用在类或者方法上。
其次,使用@Conditional注解是需要给它传一个Condition类型数组。这个Condition是什么,他就是一个接口,里面是一个叫做matches的方法,这个方法就是用来些条件逻辑用的。这就说明要使用@Conditional注解时,如果不用系统自带的Conditon,我们还需要自定义一个实现Condition的类。

下面看例子:

例子1:如果是Window系统就将LiLei这个bean放到容器,如果是Linxu系统就将HanMeiMei这个bean放到容器中。

首先如果不适用@Configuration,只是用@Bean,我们用如下代码会发现2个bean都放到了容器中

@Configuration // 相当于写了一个spring的xml配置文件
public class MyConfig {
    @Bean("LiLei")
    public Person person1(){
        return new Person("LiLei");
    }

    @Bean("HanMeiMei")
    public Person person2(){
        return new Person("HanMeiMei");
    }
}
public class AppliactionRunner {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
         String[] names = applicationContext.getBeanNamesForType(Person.class);
        for (String name : names) {
            System.out.println(name);
        }
    }
}

 运行结果:

现在我们使用上@Configuration后,再来看一下效果,上面说过使用@Configuration时需要给他传一个实现Condition接口的类,来作为条件的逻辑,下面我们一次编写这些代码来看@Conditional的作用。

首先需要编写2个Condition接口的实现类,用来作为条件判断的逻辑(也就是判断是window系统还是LInux系统)

  • WindowCondition.java
    public class WindowsCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            Environment environment = context.getEnvironment();
            String property = environment.getProperty("os.name");
            if(property.contains("Windows")){
                return true;// 返回true,那么bean就会放到容器中
            }
            return false;
        }
    }
    
  • LinuxCondition.java 
    public class LinuxCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            Environment environment = context.getEnvironment();
            String property = environment.getProperty("os.name");
            if(property.contains("Linux")){
                return true;
            }
            return false;
        }
    }

有了Condition后,我们就可以在@Bean上使用@Conditional注解了,如下

@Configuration // 相当于写了一个spring的xml配置文件
public class MyConfig {
    //如果是windows系统,就把这个bean放到容器中(其实就是看WindowsCondition中方法返回是true还是false,为true就可以把这个bean放到容器中)
    @Conditional(WindowsCondition.class)
    @Bean("LiLei")
    public Person person1(){
        return new Person("LiLei");
    }
    @Conditional(LinuxCondition.class)//如果是linux系统,就把这个bean放到容器中,原理同上
    @Bean("HanMeiMei")
    public Person person2(){
        return new Person("HanMeiMei");
    }
}

 运行的类上面有了,这里就不写了,然后运行代码,结果如下:

可以看到只有LiLei这个bean放到了容器中,因为我的系统是Windows的。

总结:
@Conditional一般跟@Bean一起使用,使用@Conditional需要传一个Condition的参数,可以使用自带的,也可以自定义,自定义只需要编写实现Condition接口的类即可,然后把这个类当作参数放到@Conditional注解的括号中就行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是基于 Spring 框架的快速开发框架,它大量使用了注解来简化开发流程,提升开发效率。下面是一些常用的 Spring Boot 注解的详解: 1. @SpringBootApplication:标注一个类,表示这是一个 Spring Boot 应用,相当于同时加上了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 这三个注解。 2. @RestController:标注一个类,表示这是一个控制器类,相当于同时加上了 @Controller 和 @ResponseBody 这两个注解。 3. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:分别表示 HTTP 请求中的 GET、POST、PUT、DELETE 方法,用于处理请求。 4. @PathVariable:用于获取 URL 路径中占位符的值。 5. @RequestParam:用于获取请求参数的值。 6. @RequestBody:用于获取请求体中的内容。 7. @Validated:用于参数校验,通常与 @RequestParam 或 @RequestBody 一起使用。 8. @Autowired:自动注入依赖,可以注入 Spring 容器中的 Bean。 9. @Service、@Repository、@Controller、@Component:用于标注服务类、持久层类、控制器类和普通组件类,让 Spring Boot 自动扫描并注入到 Spring 容器中。 10. @ConfigurationProperties:用于将配置文件中的属性值注入到类中。 11. @Conditional:用于根据条件决定是否注册 Bean。 12. @Scheduled:用于定时任务,指定方法会定时执行。 13. @Async:用于异步方法调用,可以让方法在另一个线程中执行。 14. @EnableScheduling:开启定时任务。 15. @EnableAsync:开启异步方法调用。 这些注解只是 Spring Boot 中比较常用的一部分,还有很多其他的注解,需要根据具体的开发需求来选择使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值