Spring-条件注解
条件注解就是:根据你当前的环境来注册不同的实例
某一个条件满足的时候bean才会被注册进去
代码部分
1.ShowCmd.java 接口
package org.javaboy.ioc;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-21-20-29
*/
public interface ShowCmd {
String showCmd();
}
2.WindowsShowCmd.java
package org.javaboy.ioc;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-21-20-30
*/
public class WindowsShowCmd implements ShowCmd {
public String showCmd() {
return "dir";
}
}
3.LinuxShowCmd.java
package org.javaboy.ioc;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-21-20-31
*/
public class LinuxShowCmd implements ShowCmd {
public String showCmd() {
return "ls";
}
}
4.WindowsCondition.java
package org.javaboy.ioc;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-21-20-33
*/
public class WindowsCondition implements Condition {
//这个方法返回true表示条件成立,false代表不成立
//conditionContext:用来获取环境信息 annotatedTypeMetadata:用来获取Spring的环境信息
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获取操作系统信息
String osName = conditionContext.getEnvironment().getProperty("os.name");
return osName.toLowerCase().contains("win");
}
}
5.LinuxCondition.java
package org.javaboy.ioc;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-21-20-58
*/
public class LinuxCondition implements Condition {
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String osName = conditionContext.getEnvironment().getProperty("os.name");
return osName.toLowerCase().contains("linux");
}
}
6.JavaConfig.java
package org.javaboy.ioc;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-21-21-00
*/
@Configuration
public class JavaConfig {
@Bean("cmd")
@Conditional(WindowsCondition.class)
ShowCmd winCmd(){
return new WindowsShowCmd();
}
@Bean("cmd")
@Conditional(LinuxCondition.class)
ShowCmd linuxCmd(){
return new LinuxShowCmd();
}
}
7.Main.java
package org.javaboy.ioc;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.lang.reflect.AnnotatedElement;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-21-21-09
*/
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
ShowCmd cmd = (ShowCmd)ctx.getBean("cmd");
String s = cmd.showCmd();
System.out.println("s = "+s);
}
}
运行结果图
完~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术