SpringBoot之@Conditional注解实现选择性的创建Bean操作

embedded/2024/11/14 3:19:37/

Condition 是在Spring 4.0增加的条件判断功能,通过这个功能可以实现选择性的创建Bean操作。即满足这个条件才帮我们创建Bean。

从一个案例出发学习Condition

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

没加condition的情况

1、先创建一个名为User的Bean

java">@Component
public class User {
}

2、创建配置类

java">@Configurable
public class UserConfig {@Beanpublic User user(){return new User();}
}

3、获取user,打印出来

java">public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);Object user = context.getBean("user");System.out.println(user);}

此时运行结果:可以得到user

@Conditional注解

我们在代码中加入一个@Conditional注解,查看这个注解。

java">@Configurable
public class UserConfig {@Bean@Conditional()public User user(){return new User();}
}

查看 @Conditional

java">@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {Class<? extends Condition>[] value();
}

查看Condition接口 

java">@FunctionalInterface
public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

使用时,加入@Conditional注解,里面传一个public interface Condition接口的实现类,并且复写matches方法,返回true或者false。如果返回true。那么这个bean将被spring容器创建。

参数context:上下文对象,用于获取环境、IOC容器、ClassLoader对象

参数metadata注解元对象,用于获取注解定义的属性值

使用注解:实现导入Jedis坐标后,加载该Bean,没导入,则不加载。

1、导入jedis依赖

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

2、创建ClassCondition类实现Condition接口,重写matches方法。

java">public class ClassCondition implements Condition {@Override//判断import redis.clients.jedis.Jedis文件是否存在,//存在,就表示导入了jedispublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {boolean flag=true;try {Class<?> aClass = Class.forName("redis.clients.jedis.Jedis");} catch (ClassNotFoundException e) {flag=false;}return flag;}
}

3、加入@Conditional注解

java">@Configurable
public class UserConfig {@Bean@Conditional(ClassCondition.class)public User user(){return new User();}
}

运行结果:

注释掉jedis依赖,结果

 


http://www.ppmy.cn/embedded/31203.html

相关文章

K8S哲学 - 资源调度 DaemonSet

应用场景 日志收集 引出&#xff1a; 正常情况下&#xff0c;每个服务都会进行 各自的日志收集、但是因为他们不在 同一台 Node 上&#xff0c;导致一旦查日志就需要 调动各个 机器进行切换&#xff0c;不方便也不高效 低级做法&#xff1a; 在每个需要收集日志的机器上部…

MyBatis 使用 XML 文件映射

在MyBatis中 我们可以使用各种注解来配置我们Mapper 类中的方法 我们为什么要使用XML文件呢&#xff1f; 如果我们是一条非常长的SQL 语句 使用 注解配置的话&#xff0c; 会非常不利于阅读 如下 所以&#xff0c;就需要使用到一个XML文件来对SQL语句进行映射&#xff0c;那么 …

华为试题之删除最少字符

题目描述 删除字符串中出现次数最少的字符 如果多个字符出现次数一样则都删除 输入描述 输入只包含小写字母 输出描述 输出删除后剩余的字符 若删除后字符串长度为0&#xff0c;则输出empty 我的思路是将字符串中的字符对应的数量和key统计后放到对应的字典中&#xff0c; 对字…

Java 【数据结构】常见排序算法实用详解(上) 插入排序/希尔排序/选择排序/堆排序【贤者的庇护】

登神长阶 上古神器-常见排序算法 插入排序/选择排序/堆排序 &#x1f4d4; 一.排序算法 &#x1f4d5;1.排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&a…

前端初学者的 CSS 入门

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 CSS 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 从这篇文章开始…

《Python编程从入门到实践》day19

#昨日知识点回顾 使用unittest模块测试单元和类 #今日知识点学习 第12章 武装飞船 12.1 规划项目 游戏《外星人入侵》 12.2 安装pygame 终端管理器执行 pip install pygame 12.3 开始游戏项目 12.3.1 创建Pygame窗口及响应用户输入 import sysimport pygameclass…

数据仓库——聚集

在数据仓库中&#xff0c;聚集&#xff08;Aggregation&#xff09;是一个重要的概念&#xff0c;它涉及到对大量详细数据进行统计和汇总&#xff0c;以便更高效地执行查询和分析。以下是关于数据仓库中聚集的详细解释&#xff1a; 概念&#xff1a;聚集是指按照维度粒度、指标…

msyql数据库创建可以远程登录的用户和重置root密码

创建新用户&#xff0c;只能本地连接&#xff0c;无法远程登录。 CREATE USER new_userlocalhost IDENTIFIED BY password; GRANT ALL PRIVILEGES ON *.* TO new_userlocalhost; FLUSH PRIVILEGES; 创建新用户&#xff0c;并授权相关数据库的权限给用户。 GRANT SELECT, INS…