Spring系列(六):@Conditional注解用法介绍
目录
3.4 新建TestConditionalConfig.java 配置文件
3.5 新建TestConditional.java 测试文件
今天给大家介绍@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时,才会触发实例化。
作者:天使不哭
微信号:hgmyzhl
微信公众号:小明互联网技术分享社区
CSDN:IT技术分享社区
知乎:IT技术分享社区
出处:小明互联网技术分享社区
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
合集:
Spring注解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-03-10 程序员效率:职业倦怠的理解
2019-03-10 扎心!程序员泪奔的8个瞬间
2017-03-10 微信小程序看上去很美