【Spring】条件注解

news/2024/5/20 1:15:58 标签: spring, java, 后端, spring源码, gradle

🎈博客主页:🌈我的主页🌈
🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏
🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩🚩🚩
🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页


目录

  • 🌟 一、条件注解


🌟 一、条件注解

可以根据条件,向 Spring 容器中注册 Bean,比如,我们有一个展示所有文件的命令,该命令在 Windows 上是 dir,在 Linux 上则是 ls,我们希望系统能够根据运行的环境,自动展示该命令的值。
首先定义一个命令展示接口:

java">public interface ShowCmd {
	public String showcmd();
}

然后,Windows 和 Linux 分别实现该接口:

java">public class WindowsShowCmd implements ShowCmd{
	public WindowsShowCmd() {
		System.out.println("windows init");
	}

	@Override
	public String showcmd() {
		return "dir";
	}
}

public class LinuxShowCmd implements ShowCmd{
	public LinuxShowCmd() {
		System.out.println("linux init");
	}

	@Override
	public String showcmd() {
		return "ls";
	}
}

接下来,创建两个条件,系统将根据这两个条件来判断是否将 Bean 注册到 Spring 容器中:

java">public class WindowsConditional implements Condition {
	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		String osName = context.getEnvironment().getProperty("os.name");
		System.out.println(osName);
		return osName.toLowerCase().contains("windows");
	}
}

public class LinuxConditional implements Condition {
	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		String osName = context.getEnvironment().getProperty("os.name");
		return osName.toLowerCase().contains("linux") || osName.toLowerCase().contains("mac");
	}
}


注意,虽然这里写了两个 Bean,但是实际上向 Spring 容器中注册的 Bean 只有一个
在这里插入图片描述
所以从 Spring 容器中获取到的就是一个 Bean:

java">public class demo {
	public static void main(String[] args) {
		//ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
		ShowCmd bean = ctx.getBean(ShowCmd.class);
		String showcmd = bean.showcmd();
		System.out.println(showcmd);
	}
}

条件注解有两个经典的使用场景:

  • 多环境切换

  • Spring Boot 中的自动化配置


http://www.niftyadmin.cn/n/5036691.html

相关文章

Access输入的SQL表达式中提示无效日期值的解决办法

一、问题 使用Access时候出现“输入的表达式中含有一个无效日期值。” 这是怎么回事呢?如下图: 二、解决办法 问题分析: 明显地看到,日期那里显示了“星期X”,问题的根源就在这里; 更改计算机的日期显示设置为不显示…

使用Java和NLP技术实现AI伪原创文章自动生成:一个详细的编程指南

第一部分:引言和背景 1. 引言 随着技术的进步,AI领域特别是自然语言处理(NLP)领域已经得到了迅速的发展。一种特殊的应用是AI伪原创文章的自动生成,它可以在保持原文意义的前提下,为内容创造一个新的表达…

利用Java EE相关技术实现一个简单的Web聊天室系统

利用Java EE相关技术实现一个简单的Web聊天室系统 (1)编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息。 (2)通过请求指派来处理用户提交的登录信息,如果用户名…

springboot自定义Json序列化返回,实现自动转换字典值

自定义序列化 原理 当你使用Spring Boot的Spring Data或者Spring MVC等组件来处理JSON序列化时,Spring框架会在需要将Java对象转换为JSON字符串时调用JsonSerializer。这通常发生在控制器方法返回JSON响应时,或者在将对象保存到数据库等操作中。 // 注册…

vue的模板语法(下篇)

目录 一.事件处理 二.表单的综合案例 三.组件通信⭐⭐ 3.1 自定义组件 3.2 组件通信之父传子 3.3组件通信之子传父 一.事件处理 Vue通过由点(.)表示的指令后缀来调用修饰符&#xff0c; .stop .prevent .capture .self .once 如下&#xff1a; 阻止单击事件冒泡 <a v-on…

嵌入式笔试面试刷题(day15)

文章目录 前言一、Linux中的主设备号和次设备号1.查看方法2.主设备号和次设备号的作用 二、软件IIC和硬件IIC的区别三、变量的声明和定义区别四、static在C和C中的区别五、串口总线空闲时候的电平状态总结 前言 本篇文章继续讲解嵌入式笔试面试刷题&#xff0c;希望大家坚持跟…

【Python深度学习】深度学习入门介绍

引言 深度学习是人工智能领域中最受关注和研究的子领域之一&#xff0c;它在计算机视觉、自然语言处理、语音识别、推荐系统等各个领域都有广泛的应用。本文将详细介绍深度学习的发展历史、不同类型、应用领域以及未来发展前景。 1、深度学习的发展历史 深度学习的起源可以追溯…

Docker实战技巧(二):Kubernetes基础操作实战

Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题 1、关闭防火墙并设置开机禁用   systemctl stop firewalld   systemctl disable firewalld 2、配置repo   cd /etc/yum.repos.d/   下载Docker repo   wget https://mirrors.aliyun.com/docker-…