Spring系列(六):@Conditional注解用法介绍

目录

1、@Conditional注解介绍

2、@Conditional的源码内容如下:

3、用法示例

3.1 新建Book.java 文件

3.2 CNCondition.java 文件

3.3 ZHCondition.java 文件

3.4 新建TestConditionalConfig.java 配置文件

3.5 新建TestConditional.java 测试文件

4、@Conditional应用场景

5、@Conditional的扩展注解


今天给大家介绍@Conditional懒加载注解用法,希望对大家能有所帮助!

       f26a114f46c2dc70dd8c76033b85a57a.png        

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;}@Overridepublic 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 表示中文返回 truereturn 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默认语言 表示中文返回 truereturn 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时,才会触发实例化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机知识:手机蓝牙有6个使用场景,你都知道吗?

估计很多人都没有深入的了解蓝牙的功能&#xff0c;蓝牙的有些功能强大到不可思议。 1. 连接蓝牙耳机 随着3.5mm的耳机孔被很多机型取消以后&#xff0c;不少用户都只能选择使用蓝牙耳机或者转换器。 那么这时候蓝牙功能就发挥了很大的用处&#xff0c;现在多数人都会选择使用A…

电脑知识:如何保养自己的电脑,看完你就懂了

目录 一、环境对电脑寿命的影响是不可忽视的。 二、良好的个人使用习惯对电脑的影响也很大 2.1 建议正确地执行开机和关机顺序 2.1.1 开机的顺序 2.1.2 关机顺序 2.2 电脑维护要注意以下几点 2.2.1&#xff0e;保持安置电脑的房间干燥和清洁 2.2.2&#xff0e;正确开机&#xf…

提供用户接口

1:命令接口 2:图形用户接口 3:程序接口

硬件知识:SSD越用越慢的原因,看完你就懂了

从机械硬盘到SSD硬盘的升级&#xff0c;让无数PC用户感受到什么叫“丝滑流畅”。然而&#xff0c;使用一段时间以后&#xff0c;总会感到你的SSD有如下变化&#xff1a; 同样使用环境下&#xff0c;同款测试软件测得的磁盘性能降低&#xff1b;磁盘写入速度出现大起大落的速度波…

网络知识:为什么你家里的网速慢,看完你就懂了?

大家可能深有体会&#xff0c;明明装的是50M光纤&#xff0c; 为什么网速还是这么慢呢&#xff1f;原因何在&#xff1f;这种事几乎大部分人就会遇到。 那么今天我们科普一下“网速为什么慢”很必要。我们一直起来看看。 1 你家的宽带是怎样访问互联网的&#xff1f; 如果把上网…

Spring系列(七):@FactoryBean注解用法介绍

目录 1、FactoryBean注解介绍 2、FactoryBean的源码内容如下&#xff1a; 3、用法示例 3.1 新建Book.java 3.2 新建BookFactoryBean.java 3.3 FactoryBeanConfig.java 3.4 TestFactoryBean.java 4、FactoryBean应用场景 5、典型应用 今天给大家介绍FactoryBean注解用法&#xf…

Spring系列(八):Spring生命周期中BeanPostProcessor接口用法介绍

目录 1、BeanPostProcessor 概念介绍 2、BeanPostProcessor接口方法 2.1 BeanPostProcessor源码内容 3、BeanPostProcessor 接口的作用 4、代码示例 4.1 新建Person.java 类文件 4.2、新建MyBeanPostProcessor.java 4.3、新建TestBeanPostProcessorConfig.java 配置类 4.4、新建…

操作系统:Windows映射网络文件夹的方法介绍

大家在工作中我们经常需要访问局域网服务器的共享文件夹&#xff0c;并将共享文件夹做网络映射&#xff0c;映射之后就相当于是访问本地磁盘一样访问远程服务器的共享文件夹。那么如何做网络映射呢&#xff1f;我们以windows操作系统为例&#xff0c;给大家分享一下网络映射的方…

运维:分享四款非常好用的命令行软件

目录 1、终端程序 — Alacritty 2、Shell – Fish 3、终端复用 — Tmux 4、编辑器 — Vim 常言道&#xff0c;工欲善其事、必先利其器&#xff0c;熟练一套高效且趁手的工具&#xff0c;对开发工作的重要性不言而喻。 本文给大家分享下命令行开发环境&#xff0c;文章较长&…

开发工具:Git和SVN有哪些差异,看完你就懂了?

目录 Git vs SVN Git核心思想 Git-SVN常用命令 初始化 配置 增删文件 分支 提交 拉取 撤销 查询 Git或SVN相信很多搞技术的工程师都用过&#xff0c;不仅仅只有程序员才进行版本管理&#xff0c;机械、硬件、测试等其他岗位也有版本管理的需求。 早期用SVN的比较多&#xff0c;…

微信PC版近期更新的几个功能,你都会用吗?

目录 1、查找和添加微信号 2、截图识别二维码或小程序码 3・识别聊天窗口二维码和小程序码 4、左侧菜单栏新增搜一搜 5、发送文件时多出一个留言输入框 6、群聊邀请确认同步至PC端 7、视频号新增添加到桌面快捷方式 8、支持电脑开机时自动启动微信 9、微信电子身份证新功能上线…

Spring系列(九):Spring属性赋值注解@Value 用法介绍

目录 1、Value注解的作用 2、Value 注解的写法 3、用法示例 3.1 resources 目录新增 book.properties 配置文件 3.2 新增实体 Book.java 3.3 新增 TestValueConfig.java 3.4 新增 TestValue.java 测试文件 4、使用场景 今天给大家分享Spring属性赋值注解Value 用法&#xff0c…

Linux:9个实用shell运维脚本

目录 1、Dos攻击防范&#xff08;自动屏蔽攻击IP&#xff09; 2、Linux系统发送告警脚本 3、MySQL数据库备份单循环 4、MySQL数据库备份多循环 5、Nginx访问访问日志按天切割 6、Nginx访问日志分析脚本 7、查看网卡实时流量脚本 8、服务器系统配置初始化脚本 9、监控100台服务器…

Spring系列(十):@Autowired 和@Resource注解用法介绍

目录 一、Autowired 注解 1.1 介绍 1.2 作用 二、Resource 注解 2.1 介绍 2.2 Resource 自动注入顺序 三、Autowired 和 Resource区别 3.1 相同点&#xff1a; 3.2 不同点&#xff1a; 今天给大家分享Spring属性注入的注解Autowired 和Resource介&#xff0c;希望对大家能有所帮…

电脑软件:5个实用的Windows软件,大幅度提高你的工作效率

目录 软件一&#xff1a;投屏宝 软件二&#xff1a;Everything 软件三&#xff1a;uTools 软件四&#xff1a;Quicklook 软件五&#xff1a;CCleaner 今天小编给大家大家推荐这5款Windows必装的效率软件&#xff0c;实用又免费&#xff0c;可以大幅度提高你的工作效率。 软件一…