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

作者:lxrqiyuan 时间:2023-10-15 10:04:59 

前言

本文章接上一篇文章继续谈一谈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对象。

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

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

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

来源:https://blog.csdn.net/lxrqiyuan/article/details/126259644

标签:Spring,condition,条件判断,自动配置
0
投稿

猜你喜欢

  • java判断各类型字符个数实例代码

    2022-01-22 16:39:15
  • C#中dynamic关键字的正确用法(推荐)

    2023-11-12 09:20:22
  • 对Mapper 中几种update的区别说明

    2023-05-19 04:39:44
  • DevExpress设置饼状图的Lable位置实例

    2022-02-02 15:53:37
  • c#源码的执行过程详解

    2023-10-01 17:03:37
  • Android Activity 不能被截屏的解决方法

    2021-06-28 08:37:35
  • Java中DataInputStream和DataOutputStream的使用方法

    2023-02-03 04:08:28
  • WinForm中Application.Idle方法详解

    2022-09-05 01:53:06
  • 关于C#中的Invoke示例详解

    2023-06-20 10:17:14
  • C++实现连连看游戏

    2023-12-06 02:18:09
  • Android TabLayout 实现底部Tab的示例代码

    2023-09-16 12:21:17
  • Android Volley框架使用源码分享

    2023-09-10 09:43:44
  • Java工具类DateUtils实例详解

    2022-08-22 00:40:35
  • Java rmi远程方法调用基本用法解析

    2023-02-20 08:44:19
  • Cors实现java后端完全跨域实例

    2022-01-04 15:03:33
  • Android编程实现实时监听EditText文本输入的方法

    2023-04-23 02:58:16
  • 详解C#中的定时器Timer类及其垃圾回收机制

    2021-07-21 10:57:39
  • 解决Weblogic部署war找不到spring配置文件的问题

    2022-12-29 07:03:08
  • 深入解析Java接口(interface)的使用

    2022-05-07 07:50:51
  • Android实现微信朋友圈发本地视频功能

    2021-06-18 07:56:03
  • asp之家 软件编程 m.aspxhome.com