当前位置: 首页 > news >正文

Spring条件注解@Conditoinal+ Profile环境切换应用@Profile

Spring条件注解

一、创建一个maven项目

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.5.RELEASE</version></dependency>
</dependencies>

二、接口以及实现类

public interface Food {String showName();
}
public class Rice implements Food {public String showName() {return"米饭";}
}
public class Noodles implements Food {public String showName() {return"面条";}
}

三、配置类

两个 Bean 的名字都为 food,这不是巧合,而是有意取的。两个 Bean 的返回值都为其父类对象 Food
每个 Bean 上都多了 @Conditional 注解,当 @Conditional 注解中配置的条件类的 matches 方法返回值为 true 时,对应的 Bean 就会生效。

@Configuration
public class JavaConfig{@Bean("food")@Conditoinal(RiceConditionl.class)Food rice(){return new Rice();}@Bean("food")@Conditional(NoodlesCondition.class)Food noddles(){return new Noddles();}
}

四、条件Condition接口的实现类,用来做出判断

在 matches 方法中做条件属性判断,当系统属性中的 people 属性值为 ‘北方人’ 的时候,NoodlesCondition 的条件得到满足,当系统中 people 属性值为 ‘南方人’ 的时候,RiceCondition 的条件得到满足,换句话说,哪个条件得到满足,一会就会创建哪个 Bean

public class NoodlesCondition implements Condition{@Overridepublic boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){return context.getEnvironment().getProperty("people").equals("北方人");}
}public class RiceCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return context.getEnvironment().getProperty("people").equals("南方人");}
}

六、测试

public class Main {public static void main(String[] args) {// AnnotationConfigApplicationContext 实例用来加载 Java 配置类AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();//添加一个 property 到 environment 中,添加完成后,再去注册我们的配置类ctx.getEnvironment().getSystemProperties().put("people", "南方人");ctx.register(JavaConfig.class);//刷新容器ctx.refresh();//从容器中去获取 food 的实例了,这个实例会根据 people 属性的不同,而创建出来不同的 Food 实例Food food = (Food) ctx.getBean("food");System.out.println(food.showName());}
}

Profile环境切换

更改配置类
这次不需要条件注解了,取而代之的是 @Profile

@Configuration
public class JavaConfig{@Bean("food")@Profile("南方人")Food rice(){return new Rice();}@Bean("food")@Profile("北方人")Food noddles(){return new Noddles();}
}

测试

public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();ctx.getEnvironment().setActiveProfiles("南方人");ctx.register(JavaConfig.class);ctx.refresh();Food food = (Food) ctx.getBean("food");System.out.println(food.showName());}
}

@Profile注解定义

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class) //条件类
public @interface Profile {String[] value();
}
class ProfileCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());if (attrs != null) {for (Object value : attrs.get("value")) {if (context.getEnvironment().acceptsProfiles(Profiles.of((String[]) value))) {returntrue;}}returnfalse;}returntrue;}
}

相关文章:

  • --max-old-space-size=8192报错
  • [工业自动化-22]:西门子S7-15xxx编程 - 软件编程 - 如何PLC建立用户界面: SIMATIC 面板式HMI 或工控机PC HMI
  • JS-项目实战-更新水果单价更新小计更新总计
  • 快速构建高质量中文APP登录注册页面Figma源文件
  • Linux基本指令及周边(第一弹)
  • BeautifulReport测试报告框架
  • 计算机网络的性能指标
  • IDEA 2023搭建 SpringMVC +FreeMarker+JDBC
  • 【python】均值、中值和高斯滤波详解和示例
  • 以程序员的身份使用curl获取速卖通详情
  • 第四章 将对象映射到 XML - 异常
  • 读书笔记:彼得·德鲁克《认识管理》第21章 企业与政府
  • Spring JdbcTemplate Junit 测试 - ResultSetExtractor/RowMapper
  • 元数据管理,数字化时代企业的基础建设
  • make的内置变量
  • 时间复杂度分析经典问题——最大子序列和
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • codis proxy处理流程
  • iOS编译提示和导航提示
  • js写一个简单的选项卡
  • PAT A1017 优先队列
  • Vue UI框架库开发介绍
  • 服务器从安装到部署全过程(二)
  • 高度不固定时垂直居中
  • 回顾2016
  • 跨域
  • 码农张的Bug人生 - 见面之礼
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信小程序填坑清单
  • 问题之ssh中Host key verification failed的解决
  • 写给高年级小学生看的《Bash 指南》
  • 移动端唤起键盘时取消position:fixed定位
  • Python 之网络式编程
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ###STL(标准模板库)
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.ajax()
  • (6)设计一个TimeMap
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (新)网络工程师考点串讲与真题详解
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)项目管理杂谈-我所期望的新人
  • *上位机的定义
  • .NET Framework杂记
  • .Net mvc总结
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...