Spring基于@Conditional条件化装配bean

 更新时间:2020年04月20日 09:09:40   作者:知识追寻者  
这篇文章主要介绍了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());
  }
}

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

相关文章

  • SpringBoot3使用​自定义注解+Jackson实现接口数据脱敏的步骤

    SpringBoot3使用​自定义注解+Jackson实现接口数据脱敏的步骤

    本文介绍了一种以优雅的方式实现对接口返回的敏感数据,如手机号、邮箱、身份证等信息的脱敏处理,这种方法也是企业常用方法,话不多说我们一起来看一下吧
    2024-03-03
  • SpringBoot之解决多个定时任务阻塞的问题

    SpringBoot之解决多个定时任务阻塞的问题

    这篇文章主要介绍了SpringBoot之解决多个定时任务阻塞的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • java中如何使用HttpClient调用接口

    java中如何使用HttpClient调用接口

    这篇文章主要介绍了java中如何使用HttpClient调用接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java实现MD5加密的方式与实例代码

    Java实现MD5加密的方式与实例代码

    MD5加密是一种常见的加密方式,我们经常用在保存用户密码和关键信息上。那么它到底有什么,又什么好处呢,会被这么广泛的运用在应用开发中
    2021-10-10
  • 基于SpringBoot实现发送带附件的邮件

    基于SpringBoot实现发送带附件的邮件

    这篇文章主要介绍了基于SpringBoot实现发送带附件的邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • spring的13个经典面试题

    spring的13个经典面试题

    Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容Spring解决了开发者在J2EE开发中遇到的许多常见的问题,我们这篇文章就来了解一下spring的面试题
    2021-06-06
  • idea插件篇之java内存分析工具(JProfiler)的使用

    idea插件篇之java内存分析工具(JProfiler)的使用

    这篇文章主要介绍了idea插件篇之java内存分析工具(JProfiler),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 基于JDBC访问MySql公共方法实例解析

    基于JDBC访问MySql公共方法实例解析

    这篇文章主要介绍了基于JDBC访问MySql公共方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 通俗讲解JVM的类加载机制

    通俗讲解JVM的类加载机制

    这篇文章主要介绍了JVM的类加载机制的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • 创建动态代理对象bean,并动态注入到spring容器中的操作

    创建动态代理对象bean,并动态注入到spring容器中的操作

    这篇文章主要介绍了创建动态代理对象bean,并动态注入到spring容器中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论