zoukankan      html  css  js  c++  java
  • 020 使用@Conditional注解完成条件注入

    一 .概述

    在spring之中提供@Conditional注解完成条件注入.

    我们可以实现特定的接口,完成配置类可以根据条件进行Bean的创建.


     二 .测试

    public abstract class OS {
        protected String name;
        
        public String getName() {
            return this.name;
        }
    }
    
    class Windows extends OS {
        public  Windows() {
             super.name = "windows";
        }
        
    }
    
    class Linux extends OS {
        public Linux() {
            super.name = "linux";
        }
    }

    配置类:

    @Configuration
    public class ConditionalConfig {
        
        @Bean//只用条件成立才会创建对象
        @Conditional(WindowsConditonal.class)
        public OS windows() {
            return new Windows();
        }
        
        @Bean
        @Conditional(LinuxConditional.class)
        public OS linux() {
            return new Linux();
        }
    }

    两个条件类:

    public class AbstractConditional {
        
        public String getOSName(ConditionContext context) {
            Environment environment = context.getEnvironment();
            String osName = environment.getProperty("os.name");
            return osName;
        }
    }
    public class WindowsConditonal extends AbstractConditional implements Condition{
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            if(super.getOSName(context).toUpperCase().contains("WINDOWS")) {
                return true;
            }
            return false;
        }
    
    }
    public class LinuxConditional  extends AbstractConditional implements Condition{
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            if(super.getOSName(context).toUpperCase().contains("LINUX")) {
                return true;
            }
            return false;
        }
    
    }

    只有当当前的操作系统为windows时,才会注入该bean.

    测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes= {ConditionalConfig.class})
    public class ConditionalTest {
        
        @Autowired
        private ApplicationContext context;
        
        @Test
        public void test() {
            System.out.println(context.getBean(OS.class).getName());
        }
    }

    结果返回为window,说明在当前的操作系统中只能创建一个Bean,另外一个Bean的声明并不会执行,否则getBean()方法会出现问题.


    三 . 总结

    [1] 如果我们想要按照一定的条件注册Bean,我们就可以使用@Conditional注解.

    [2]在使用@Conditional注解的时候,我们需要指明一个Condition接口的子类.

    [3]spring会按照Condition的实现类完成是否创建该Bean.

    [4]在本节之中,我们使用了一个环境属性的概念,这个概念在后面我们会重点说明.

  • 相关阅读:
    【爬虫】新闻统计
    python pip 出错 "Can't connect to HTTPS URL because the SSL module is not available.
    【sql server复制】sql server复制【最佳实践】
    mybase个人数据库笔记工具下载
    sqlserver脱机时ldf文件丢失重建
    sqlserver CTE定位点类型和递归部分的类型不匹配
    mysql物理存储(页区段)
    sql server update与delete引发的死锁
    Linux学习笔记(19)linux定时任务(crontab)
    mysql工具生态
  • 原文地址:https://www.cnblogs.com/trekxu/p/9094869.html
Copyright © 2011-2022 走看看