Spring中@Conditional注解用法详解
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注解用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解SpringMVC组件之HandlerMapping(一)
这篇文章主要介绍了详解SpringMVC组件之HandlerMapping(一),HandlerMapping组件是Spring MVC核心组件,用来根据请求的request查找对应的Handler,在Spring MVC中,有各式各样的Web请求,每个请求都需要一个对应的Handler来处理,需要的朋友可以参考下2023-08-08使用AbstractRoutingDataSource实现数据源动态切换的实例
AbstractRoutingDataSource 是 Spring 框架提供的一个抽象类,用于实现动态数据源路由,这个类主要用于多数据源场景,其中可以根据不同的条件动态地切换到不同的数据源,本文给大家介绍了如何使用AbstractRoutingDataSource实现数据源动态切换,需要的朋友可以参考下2024-03-03解决java使用axios.js的post请求后台时无法接收到入参的问题
今天小编就为大家分享一篇解决java使用axios.js的post请求后台时无法接收到入参的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-09-09教你如何使用google.zxing结合springboot生成二维码功能
这篇文章主要介绍了使用google.zxing结合springboot生成二维码功能,我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下2022-05-05
最新评论