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

spring@Conditional

作者头像
逍遥壮士
发布2020-09-18 11:36:19
6270
发布2020-09-18 11:36:19
举报
文章被收录于专栏:技术趋势技术趋势

@Conditional是什么?可以干什么?

@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。

类图

源码学习

codition是通过判断条件若成立则注册bean否则不注册

代码语言:javascript
复制
public interface Condition {
   /**
    * 条件判断 true为匹配,false为不匹配
    */
   boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

实现源码

版本

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.11.RELEASE</version>
</dependency>
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 17:07
 * @Description:条件用户7
 */
public class ConditionUser7 implements Serializable {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ConditionUser7() {
    }

    public ConditionUser7(String name) {
        this.name = name;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 17:28
 * @Description:
 */
@Component
public class SystemCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String env_system = environment.getProperty("env_system");
        System.out.println("获取系统变量:"+env_system);
        if(env_system.equalsIgnoreCase("windows")){
            return true;
        }
        return false;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 17:27
 * @Description:
 */
@Configuration
public class ConfigSystem {
    @Conditional({SystemCondition.class})
    @Bean(name = "conditionUser7")
    public ConditionUser7 getSystemInfo(){
        return new ConditionUser7("hong2");
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 17:38
 * @Description:测试@Conditional
 */
public class ConditionalTest {
    public static void main(String[] args) {
        //从类路径的xm文件载入上下文定义的信息
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigSystem.class);
        String env_system = context.getEnvironment().getProperty("env_system");
        System.out.println("系统为:"+env_system);
        Map <String, ConditionUser7> beansOfType = context.getBeansOfType(ConditionUser7.class);
        System.out.println(JSONObject.toJSONString((beansOfType)));
    }
}

环境变量:

代码语言:javascript
复制
-Denv_system=windows

结果

代码语言:javascript
复制
获取系统变量:windows
系统为:windows
{"conditionUser7":{"name":"hong2"}}

当环境改成

代码语言:javascript
复制
-Denv_system=linux

结果

代码语言:javascript
复制
获取系统变量:linux
系统为:linux
{}

执行顺序

1.是在执行AnnotationConfigApplicationContext#reflsh方法,调用invokeBeanFactoryPostProcessors,执行 BeanFactoryPostProcessorr的postProcessBeanDefinitionRegistry 方法

2.会加载bean的定义信息

3.会执行ConditionEvaluator#shouldSkip判断这个类是否应该被跳过

然后就会调用我们自定义的ColorCondition#matches方法

如果返回false,则不会注册对应bean到ioc容器中

代码下载:https://gitee.com/hong99/spring/issues/I1N1DF

最后

@condition这个注释非常好理解也就是条件的意思,当然本版本是4.x的如果是5.x以后可能稍有不一样,不过大致相同,该注解其实就是通过一些条件来判断是否注入到bean中,的确是一个非常不错的注解,在一些业务场景下或加载某些配置。更多请查看源码,谢谢。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

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

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

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