前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 注解开发之 @Conditional

Spring 注解开发之 @Conditional

作者头像
wsuo
发布2020-07-30 17:12:04
3920
发布2020-07-30 17:12:04
举报
文章被收录于专栏:技术进阶之路技术进阶之路

这次介绍一下 Spring 中的一个重要的注解 @Conditional

本文的组织结构如下:

  • 先看一下该注解的作用是什么;
  • 再总览这些注解有哪些属性值;
  • 最后讲解一下重要的属性值。

Spring 版本 5.1.2.RELEASE

一、注解的作用

SpringBoot 中经常看到该注解及其衍生注解,它的作用是根据条件注入组件。

这里我们先创建出两个 Bean 作为例子:

代码语言:javascript
复制
@Bean("bill")
@Conditional({WindowsCondition.class})
public Person person2() {
    return new Person("比尔盖茨", 60);
}
@Bean("linus")
@Conditional({LinuxCondition.class})
public Person person3() {
    return new Person("李纳斯", 50);
}

这段代码的意思是:如果当前操作系统是 Windows 就将 比尔盖茨 放入容器中,如果是 Linux 就将 李纳斯 放入容器中。

代码语言:javascript
复制
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
String[] names = context.getBeanNamesForType(Person.class);
for (String name : names) {
    System.out.println(name);
}
// 获取当前的环境: Windows 10
String os = context.getEnvironment().getProperty("os.name");
System.out.println(os);

经过测试得到这里的环境是 Windows 10 。

二、属性总览

该注解只有一个属性。

代码语言:javascript
复制
Class<? extends Condition>[] value();

需要一个 Condition 的子类,所以我们需要自己实现一个子类。

这里我创建了两个子类分别是:

  • WindowsCondition:判断是不是 Windows 操作系统;
  • LinuxCondition:判断是不是 Linux 操作系统;

三、重要属性讲解

来看一下具体的实现类,以 WindowsCondition 为例:

代码语言:javascript
复制
public class WindowsCondition implements Condition {

    /**
     * 判断是否符合
     *
     * @param context  判断条件可以使用的上下文环境
     * @param metadata 注释信息
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 获取 IOC 使用的 beanFactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();

        // 获取到 Bean 的注册类
        BeanDefinitionRegistry registry = context.getRegistry();
        boolean cont = registry.containsBeanDefinition("person");

        // 获取当前的环境信息
        Environment environment = context.getEnvironment();

        String property = environment.getProperty("os.name");

        // 如果是 win 系统就返回 true
        return property != null && property.contains("Windows");
    }
}

需要实现一个 match 方法。

这里通过操作系统判断了是不是满足条件,还可以通过 Bean 的注册类设置更多的条件,比如这里的 registry.containsBeanDefinition("person"); 判断是否容器中存在 person 这个 Bean

LinuxCondition 的实现如下:

代码语言:javascript
复制
public class LinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String name = context.getEnvironment().getProperty("os.name");
        return name != null && name.contains("linux");
    }
}

这样经过测试容器中就只有比尔盖茨:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、注解的作用
  • 二、属性总览
  • 三、重要属性讲解
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档