当前位置: 首页 > 编程笔记 >

Spring基于@Conditional条件化装配bean

李法
2023-03-14
本文向大家介绍Spring基于@Conditional条件化装配bean,包括了Spring基于@Conditional条件化装配bean的使用技巧和注意事项,需要的朋友参考一下

一 前言

理解spring的如何根据条件装配bean有助于我们更好使用springboot进行开发,和源码理解;

@Conditional 装配bean

思路如下

Spring中提供了@Conditional注解实现条件化是否装配bean,这样可以根据条件动态的装配bean;

要判定@Conditional 注解是否该装配bean还需要Condition 接口配合,我们只须实现 Condition 接口,重写matches 方法;

根据matches方法返回的布尔值进行判定@Conditional是否需要装配bean

实现过程如下

2.1 用户类

用户类用于配置类是否装配该Bean

/**
 * @Author lsc
 * <p> </p>
 */
public class User {

  private String userName;

	// 省略 set get
}

2.2 Condition实现类

RuntimeExist 实现 Condition ,使用 conditionContext 获取jvm 环境变量,如果存在则返回 true ,否则返回false;其中conditionContext还有如下方法

  • getRegistry():使用BeanDefinitionRegistry的检查bean定义;
  • getBeanFactory():使用ConfigurableListableBeanFactory检查bean是否存在;
  • getEnvironment():Environment环境变量
  • getResourceLoader():ResourceLoader加载的资源;
  • getClassLoader():ClassLoader加载的类。
public class RuntimeExist implements Condition {
  public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    // 获取jvm 运行时环境
    Environment environment = conditionContext.getEnvironment();
    // 检查 jvm 运行时环境是否存在属性
    return environment.containsProperty("java.runtime.name");
  }
}

2.3 用户配置类

根据 RuntimeExist的 matches 方法的返回值 是否装配bean; 这边设置了属性名称 zszxz,以便于更好的测试;

/**
 * @Author lsc
 * <p> </p>
 */
@Configuration
public class UserConfig {

  @Bean
  // 根据 RuntimeExist的 matches 方法的返回值 是否装配bean
  @Conditional(RuntimeExist.class)
  public User user(){
    User user = new User();
    user.setUserName("zszxz");
    return user;
  }
}

2.4 测试

由于 jvm 运行时环境存在 java.runtime.name 属性 ,故会装配成功,会打印出 zszxz ;

如果将 java.runtime.name 改为 任意jvm 运行时不存在的属性 ,测试就会报异常;

@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
@ContextConfiguration(classes= UserConfig.class)//加载配置类
public class ConditionTest {

  @Autowired
  User user;

  @Test
  public void test(){
    // zszxz
    System.out.println(user.getUserName());
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Spring条件注解@Conditional示例详解,包括了Spring条件注解@Conditional示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 @Conditional是Spring4新提供的注解,它的作用是根据某个条件创建特定的Bean,通过实现Condition接口,并重写matches接口来构造判断条件。总的来说,就是根据特定条件来控制Bean的创建行为,这样我

  • 描述 (Description) 您可以使用default函数将mixin与其他混合匹配相匹配,并创建看起来像else或default语句的conditional mixins 。 例子 (Example) 以下示例演示了在LESS文件中使用条件mixins - <!doctype html> <head> <title>Conditional Mixins</title>

  • 条件语句用于根据程序员指定的某些条件更改执行流程。 条件语句将始终评估为true或false。 条件用于IF,Evaluate和Perform语句。 不同类型的条件如下 - IF条件声明 关系条件 Sign Condition Class Condition Condition-Name Condition 否定条件 综合条件 IF Condition 语句 IF语句检查条件。 如果条件为真,则执

  • 条件编译是选择要编译的代码和不编译的代码的过程,类似于C和C ++中的#if/#else/#endif。 任何未编译的语句仍必须在语法上正确。 条件编译涉及在编译时可评估的条件检查。 像if,for,while这样的运行时条件语句不是条件编译功能。 D的以下特征适用于条件编译 - debug version static if D中的调试声明 debug在程序开发期间很有用。 仅当启用了-debu

  • 作业输入系统使用两种方法在JCL中执行条件处理。 作业完成后,将根据执行状态设置返回代码。 返回码可以是0(成功执行)到4095之间的数字(非零表示错误条件)。 最常见的传统价值观是: 0 =正常 - 一切正常 4 =警告 - 轻微错误或问题。 8 =错误 - 重大错误或问题。 12 =严重错误 - 重大错误或问题,结果不值得信任。 16 =终端错误 - 非常严重的问题,不要使用结果。 可以使用C

  • 主要内容:1. 引入依赖,2. 开启组件扫描,3. 使用注解定义 Bean,4. 基于注解方式实现依赖注入,示例从 Java 5 开始,Java 增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息。 Spring 从 2.5 版本开始提供了对注解技术的全面支持,我们可以使用注解来实现自动装配,简化 Spring 的 XML 配置。 Spring 通过注解