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

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

前言

本文章接上一篇文章继续谈一谈condition的一些用法。

案例

上一篇文章我提的一个需求时导入jedis坐标后才能加载该Bean,否则不加载,那我们能不能将类的判断定义为动态的,就不能写死,判断哪个或哪些字节码文件可以动态指定。
那么这时我们就要用到自定义条件注解。
首先我们来自定义一个注解ConditionOnClass

自定义的注解上要加上Conditionnal注解,而它的参数仍然是一个或多个字节码文件,就可以实现相同的功能,注解内的方法返回值时一个字符串数组。

package cs.yangtze.springboot_condition.condition;
import org.springframework.context.annotation.Conditional;
import java.lang.annotation.*;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ClassCondition.class)
public @interface ConditionOnClass {
    String[] value();
}

然后我们在自定义配置文件config中添加自定义注解,注解中的参数为一个或多个想要判断的条件,即当能够使用或者存在该类的时候才能创建User的Bean对象。此处我导入的是这两个类,当然也可以换成其它的。

package cs.yangtze.springboot_condition.config;
import cs.yangtze.springboot_condition.condition.ClassCondition;
import cs.yangtze.springboot_condition.condition.ConditionOnClass;
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
 @ConditionOnClass({"redis.clients.jedis.Jedis","com.alibaba.fastjson.JSON"})
    public User user(){
        return new User();
    }
}

最后去实现condition接口,matches方法的参数代码中有注释。如果你不知道Map里面是什么,你可以打印出来,它的键就是value,值就是一个数组,也就是上面提到的自定义注解中传入的参数,即{“redis.clients.jedis.Jedis”,“com.alibaba.fastjson.JSON”}。

package cs.yangtze.springboot_condition.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import java.util.Map;
public class ClassCondition implements Condition {
    /**
     * @param context 上下文对象,用于获取环境对象,IOC容器以及ClassLoader对象
     * @param metadata 注解元对象,可用于获取注解定义的属性值
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //需求:动态的判断是否有该类
        Map<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
        String[] value = (String[]) map.get("value");
        try {
            for (String className : value) {
                Class<?> aClass = Class.forName(className);
            }
        } catch (Exception e) {
            flag = false;
        }
        return flag;
    }
}

最后能够成功创建user的bean对象,你可以删去pom文件中的任何一个依赖,最终都不能成功创建bean对象。

删去redis或fastJson依赖后都不能成功创建

总结

Condition小结:

(1)自定义条件类:自定义类实现Condition接口,重写matches方法,在matches方法中进行逻辑判断,返回boolean值。matches方法的两个参数:

· context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。

· metadata:元数据对象,用于获取注解属性。

(2)判断条件:在初始化Bean时,使用@Conditional(条件类.class)注解。

但是一般我们都不用自定义条件注解,因为SpringBoot为我们提供了一些常用的条件注解:

· ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean

· ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean

· ConditionalOnMissingbean:判断环境中没有该Bean才初始化Bean

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

相关文章

  • String.join()方法示例详解

    String.join()方法示例详解

    String.join() 方法是连接指定数组的元素或集合的成员,在每个元素或成员之间使用指定的分隔符,这篇文章主要介绍了String.join()方法示例详解,需要的朋友可以参考下
    2024-01-01
  • SpringBoot登录用户权限拦截器

    SpringBoot登录用户权限拦截器

    这篇文章主要介绍了SpringBoot登录用户权限拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java 8中default方法能做什么?不能做什么?

    Java 8中default方法能做什么?不能做什么?

    这篇文章主要给大家介绍了关于Java 8中default方法能做什么?不能做什么?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Java语言实现扫雷游戏(2)

    Java语言实现扫雷游戏(2)

    这篇文章主要为大家详细介绍了Java语言实现扫雷游戏第二部分代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Java的RocketMq队列之消息可靠性详解

    Java的RocketMq队列之消息可靠性详解

    这篇文章主要介绍了Java的RocketMq队列之消息可靠性详解,生产者通过网络发送消息给 Broker,当 Broker 收到之后,将会返回确认响应信息给 Producer,所以生产者只要接收到返回的确认响应,就代表消息在生产阶段未丢失,需要的朋友可以参考下
    2024-01-01
  • 带你了解10道java入门面试题

    带你了解10道java入门面试题

    面试题相信大家都不陌生,想要一个好的工作面试题必不可少的,下面和小编一起来学习与了解Java当中有有些什么面试题吧,希望能给你带来帮助
    2021-08-08
  • Java生成含字母和数字的6位随机字符串

    Java生成含字母和数字的6位随机字符串

    这篇文章主要为大家详细介绍了Java生成含字母和数字的6位随机字符串的相关资料,供大家参考,感兴趣的朋友可以参考一下
    2016-05-05
  • springboot实现公众号接收回复消息和超过5秒被动回复消息

    springboot实现公众号接收回复消息和超过5秒被动回复消息

    本文主要介绍了springboot实现公众号接收回复消息和超过5秒被动回复消息,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 浅谈synchronized方法对非synchronized方法的影响

    浅谈synchronized方法对非synchronized方法的影响

    下面小编就为大家带来一篇浅谈synchronized方法对非synchronized方法的影响。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 彻底搞懂Java多线程(五)

    彻底搞懂Java多线程(五)

    这篇文章主要给大家介绍了关于Java面试题之多线程和高并发的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-07-07

最新评论