Spring中@Conditional注解用法详解

 更新时间:2023年11月27日 08:30:43   作者:IT技术分享社区  
这篇文章主要介绍了Spring中@Conditional注解用法详解,@Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条件进行判断,把满足判断条件的bean注册到Spring容器,需要的朋友可以参考下

1、@Conditional注解介绍

@Conditional是Spring4版本新提供的一种注解

它的作用是按照设定的条件进行判断,把满足判断条件的bean注册到Spring容器。

2、@Conditional的源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
    /**
     * All {@link Condition Conditions} that must {@linkplain Condition#matches match}
     * in order for the component to be registered.
     */
    Class<? extends Condition>[] value();
}

说明:

  • @Conditional可以作用在方法上,也可以作用在类上。
  • 使用的时候需要传入实现Condition接口类数组。
  • 如果是类和方法都加了@Conditional注解,最终在方法上的注解为最终的条件,如果返回true则加入容器,反之不会加入容器。
  • 如果只是类上加了@Conditional注解,整个类的所有方法都会加入容器中。

3、用法示例

3.1 新建Book.java 文件

package com.spring.bean;
 
 
public class Book {
    private String bookName;
    private String bookType;
    private double price;
 
 
    public Book(String bookName, String bookType, double price) {
        this.bookName = bookName;
        this.bookType = bookType;
        this.price = price;
    }
 
 
    public String getBookName() {
        return bookName;
    }
 
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
 
    public String getBookType() {
        return bookType;
    }
 
 
    public void setBookType(String bookType) {
        this.bookType = bookType;
    }
 
 
    public double getPrice() {
        return price;
    }
 
 
    public void setPrice(double price) {
        this.price = price;
    }
 
 
    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                ", bookType='" + bookType + '\'' +
                ", price=" + price +
                '}';
    }
}

3.2 CNCondition.java 文件

package com.spring.condition;
 
 
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
 
 
public class CNCondition implements Condition {
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        // user.language=CN 表示中文返回 true
        return conditionContext.getEnvironment().getProperty("user.language").contains("cn");
    }
}

3.3 ZHCondition.java 文件

package com.spring.condition;
 
 
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
 
 
public class ZHCondition implements Condition {
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        // user.language=ZH Java默认语言 表示中文返回 true
        return conditionContext.getEnvironment()
        .getProperty("user.language").contains("zh");
    }
}

3.4 新建TestConditionalConfig.java 配置文件

package com.spring.config;
 
 
import com.spring.bean.Book;
import com.spring.condition.CNCondition;
import com.spring.condition.ZHCondition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
 
 
@Configuration
@Conditional(ZHCondition.class)
 
 
public class TestConditionalConfig {
    @Bean
    @Conditional(ZHCondition.class)//中文
    public Book bookZH()    {
        return new Book("红楼梦","中国古典书籍",99.9);
    }
 
 
    @Bean
    @Conditional(CNCondition.class)//英文
    public Book bookCN()    {
        return new Book("哈姆雷特","外国经典名著",66.6);
    }
}

3.5 新建TestConditional.java 测试文件

package com.spring.test;
 
 
import com.spring.bean.Book;
import com.spring.config.TestConditionalConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
 
import java.util.Map;
 
 
public class TestConditional {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(TestConditionalConfig.class);
        Map<String, Book> map = annotationContext.getBeansOfType(Book.class);
        System.out.println(map);
    }
}

4、@Conditional应用场景

在一些需要条件满足才是实例化的类中,使用此注解

比如项目中需要根据不同的场景使用不同的消息中间件,在消息队列的实例化bean上,使用@Conditional注解,根据配置文件的不同,来判断哪个bean需要加载到Spring容器中。

5、@Conditional的扩展注解

  • @ConditionalOnBean:仅在当前上下文中存在某个对象时,才会实例化一个Bean。
  • @ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean。
  • @ConditionalOnExpression:当表达式值为true的时候,才会实例化一个Bean。
  • @ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean。
  • @ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean。
  • @ConditionalOnNotWebApplication:非web应用,才会实例化一个Bean。
  • @ConditionalOnBean:当容器中有指定Bean的条件下进行实例化。
  • @ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化。
  • @ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。
  • @ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。
  • @ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
  • @ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。
  • @ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
  • @ConditionalOnExpression:基于SpEL表达式的条件判断。
  • @ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
  • @ConditionalOnResource:当类路径下有指定的资源时触发实例化。
  • @ConditionalOnJndi:在JNDI存在的条件下触发实例化。
  • @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时,才会触发实例化。

到此这篇关于Spring中@Conditional注解用法详解的文章就介绍到这了,更多相关@Conditional注解用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Reactor如何优雅Exception异常处理

    详解Reactor如何优雅Exception异常处理

    初识响应式编程的时候,除了从命令式的思维方式转变为函数式的编程方式外,其中有一个很大的不适应的地方就是在面对异常时该怎么处理。本文将通过Project Reactor的文档以及源码来深入解读,在reactor中是如何优雅地实现这异常处理三板斧,希望对大家有所帮助
    2023-02-02
  • java能写爬虫程序吗

    java能写爬虫程序吗

    在本篇文章里小编给大家整理的是一篇关于java是否能写爬虫程序的一篇文章,对此有兴趣的朋友们可以学习下。
    2021-01-01
  • java非公平锁知识点实例详解

    java非公平锁知识点实例详解

    在本篇文章里小编给大家整理了一篇关于java非公平锁知识点实例详解,有兴趣的朋友们可以学习参考下。
    2021-10-10
  • ES6学习笔记之新增数据类型实例解析

    ES6学习笔记之新增数据类型实例解析

    这篇文章主要介绍了ES6学习笔记之新增数据类型,结合实例形式分析了ES6数据解构赋值、新增数据类型Set集合、新增数据类型Map、Symbol类型等相关原理与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • Java String不可变性实现原理解析

    Java String不可变性实现原理解析

    这篇文章主要介绍了Java String不可变性实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 基于Spring-cloud-gateway实现全局日志记录的方法

    基于Spring-cloud-gateway实现全局日志记录的方法

    最近项目在线上运行出现了一些难以复现的bug需要定位相应api的日志,通过nginx提供的api请求日志难以实现,于是在gateway通过全局过滤器记录api请求日志,本文给大家介绍基于Spring-cloud-gateway实现全局日志记录,感兴趣的朋友一起看看吧
    2023-11-11
  • SpringBoot集成Druid实现监控功能的示例代码

    SpringBoot集成Druid实现监控功能的示例代码

    这篇文章主要介绍了SpringBoot集成Druid实现监控功能,Druid是阿里巴巴开发的号称为监控而生的数据库连接池,可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池,文中通过代码示例讲解非常详细,需要的朋友可以参考下
    2024-02-02
  • SpringBoot实现各种参数校验总结(建议收藏!)

    SpringBoot实现各种参数校验总结(建议收藏!)

    本文深入解析了Spring Validation的使用方法、实现原理及最佳实践,详细介绍了各种参数校验场景,如requestBody和requestParam/PathVariable的使用,并探讨了分组校验、嵌套校验和自定义校验的高级应用,需要的朋友可以参考下
    2024-09-09
  • springboot配置log日志按天按类缓存实现过程

    springboot配置log日志按天按类缓存实现过程

    文章介绍了如何配置Spring Boot项目中的`application.yml`文件,并在同级目录下创建`logback-spring.xml`文件以自定义日志设置,最后,展示了运行结果的图示
    2026-01-01
  • SpringBoot http请求注解@RestController原理解析

    SpringBoot http请求注解@RestController原理解析

    这篇文章主要介绍了SpringBoot http请求注解@RestController原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论