Spring自动配置之condition条件判断上篇

 更新时间:2022年08月17日 09:57:56   作者:lxrqiyuan  
这篇文章主要为大家介绍了SpringBoot condition条件判断功能的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

Condition是在Spring4.0增加的条件判断功能,通过这个功能可以实现选择性的创建Bean对象。

引入一个例子

SpringBoot是如何知道要创建哪个Bean的?比如SpringBoot是如何知道要创建RedisTemplate的?
在SpringBoot中获取应用上下文对象context,通过其getBean方法获取Bean对象

package cs.yangtze.springboot_condition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SpringbootConditionApplication {
    public static void main(String[] args) {
        //启动springboot的应用,返回spring的IOC容器
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
        //获取bean,redisTemplate
        Object redisTemplate = context.getBean("redisTemplate");
        System.out.println(redisTemplate);
    }
}

启动项目之后会报一个这样的错误:No Such Bean,这是因为我们还没有导入redis的起步依赖 

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

导入依赖后,这时SpringBoot就能够识别这样的bean对象了

通过这个例子,我们来想一想,为什么我们没有导入redis依赖的时候,SpringBoot不会为我们创建这个redisTemplate的bean对象?

SpringBoot做的事情就是判断当前环境中有没有一个redis对应的所需要的字节码文件,有的话就会帮你创建被俺对象,没有就不会创建。这时候我们就会用condition来实现。

condition的一个案例

需求:在Spring的IOC容器中有一个USer的Bean,现要求:导入Jedis坐标后加载该Bean,没导入,则不加载。

首先创建一个实体类User,不需要成员变量

然后创建condition的实现类ClassCondition,它只有一个需要重写的方法matches,返回值类型为布尔类型,至于这个返回值有什么作用,下面会有解释。

在这个重写的方法中我们就要去实现需求:导入Jedis坐标后加载该Bean。其中是一个很简单的逻辑,如果我们导入了Jedis的依赖,那我们就可以通过Class.forName(“redis.clients.jedis.Jedis”)来获取与给定的字符串名称相关联类或接口的Class对象,如果能够获取到就返回true,否则返回false。

package cs.yangtze.springboot_condition.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class ClassCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //需求:导入jedis坐标后创建Bean
        boolean flag = true;
        try {
            Class<?> aClass = Class.forName("redis.clients.jedis.Jedis");
        } catch (ClassNotFoundException e) {
            flag = false;
        }
        return flag;
    }
}

 然后创建一个配置类UserConfig,用来创建User的Bean对象
注意:在方法的上面还有一个Conditional的注解,这就是今天的重点!!!
Conditional括号中的参数是一个或多个condition的实现类,这时候就会用到上面提到的返回值,若重写的match方法返回的是TRUE,则条件成立(即我导入了Jedis坐标),那么IOC容器就会帮我去创建bean对象,否则不会。

package cs.yangtze.springboot_condition.config;
import cs.yangtze.springboot_condition.condition.ClassCondition;
import cs.yangtze.springboot_condition.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class UserConfig {
    @Bean//用于在容器中闯进Bean对象
    @Conditional(ClassCondition.class)  //参数是一个或多个condition的实现类
    public User user(){
        return new User();
    }
}

最后在启动类中通过上下文对象来获取该bean对象

package cs.yangtze.springboot_condition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SpringbootConditionApplication {
    public static void main(String[] args) {
        //启动springboot的应用,返回spring的IOC容器
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
        //获取bean,redisTemplate
        Object redisTemplate = context.getBean("redisTemplate");
        System.out.println(redisTemplate);
 		//此处getBean方法中的参数是UserConfig类中的方法名称,当然也可以在@Bean注解后加入名称,如@Bean("aaa"),那么此处的user就应换成aaa
        Object user = context.getBean("user");
        System.out.println(user);
    }
}

结果演示:当我导入Jedis坐标时,能够正常获取对象

未导入时

补充:Jedis坐标

  <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
  </dependency>

总结

本文中的是否jedis坐标只是一个简单的例子,当然也可以换成其他的条件,目的就是为了展示condition的功能,就是通过判断来选择性的创建bean对象。

到此这篇关于Spring自动配置之condition条件判断上篇的文章就介绍到这了,更多相关Spring condition条件判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA将导入的项目转成maven项目

    IntelliJ IDEA将导入的项目转成maven项目

    这篇文章主要介绍了IntelliJ IDEA将导入的项目转成maven项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java 创建线程的几种方式

    java 创建线程的几种方式

    本文主要介绍了java中创建线程的几种方式。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 详解Spring Cloud 熔断机制--断路器

    详解Spring Cloud 熔断机制--断路器

    这篇文章主要介绍了详解Spring Cloud 熔断机制--断路器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 深入讲解Java Maven配置

    深入讲解Java Maven配置

    这篇文章主要介绍了Maven的安装配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • Java虚拟机JVM优化实战的过程全记录

    Java虚拟机JVM优化实战的过程全记录

    有人说Java之所以能够崛起,JVM功不可没。Java虚拟机最初服务于让Java语言凌驾于平台之上,实现“编写一次,到处运行”,那么下面这篇文章主要给大家分享了个关于Java虚拟机JVM优化实战的过程全记录,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • 详解JNA中的回调方法

    详解JNA中的回调方法

    这篇文章主要介绍了JNA中的回调方法,主要包括JNA 中的 Callback,callback 的应用,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Spring如何处理注解的深入理解

    Spring如何处理注解的深入理解

    这篇文章主要给大家介绍了关于Spring如何处理注解的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java中的注解具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java实现幂等性校验的示例代码

    Java实现幂等性校验的示例代码

    我们在做web应用的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性,所以本文主要介绍了如何使用java aop实现幂等性校验,需要的可以参考下
    2024-02-02
  • js判断是否是移动设备登陆网页的简单方法

    js判断是否是移动设备登陆网页的简单方法

    这篇文章主要介绍了js判断是否是移动设备登陆网页的简单方法,需要的朋友可以参考下
    2014-02-02
  • mybatis防止SQL注入的方法实例详解

    mybatis防止SQL注入的方法实例详解

    SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。那么mybatis是如何防止SQL注入的呢?下面脚本之家小编给大家带来了实例代码,需要的朋友参考下吧
    2018-04-04

最新评论