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

news/2024/10/20 11:39:52/

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/news/1449745.html

相关文章

Ubuntu上的screenfetch

2024年4月28日&#xff0c;周日下午 这些文本是由一个叫做 “screenfetch” 的命令生成的&#xff0c;它会显示一些系统和用户信息&#xff0c;包括操作系统、内核版本、系统运行时间、安装的软件包数量、使用的Shell、分辨率、桌面环境、窗口管理器、主题、图标主题、字体、CP…

知乎广告开户流程,知乎广告的优势是什么?

社交媒体平台不仅是用户获取知识、分享见解的场所&#xff0c;更是品牌展示、产品推广的重要舞台。知乎作为国内知名的知识分享社区&#xff0c;以其高质量的内容生态和庞大的用户基础&#xff0c;成为了众多企业进行广告投放的优选之地。云衔科技通过其专业服务&#xff0c;助…

ssm088基于JAVA的汽车售票网站abo+vue

汽车售票网站的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对汽车售票信息管理混乱&#xff0c;出错率…

身份证实名认证接口守护账号安全、实名认证接口Java开发示例

身份证实名认证接口就是网民账号的贴身保镖&#xff0c;只需简单几步操作&#xff0c;即可实现高效、精准的身份验证&#xff0c;从此告别信息泄露的恐慌&#xff01;无论是线上交易、社交互动还是各类服务注册&#xff0c;都能确保你是独一无二的你&#xff01; 翔云身份证实…

2023-2024年汽车行业报告/方案合集(精选345份)

汽车行业报告/方案&#xff08;精选345份&#xff09; 2023-2024年 来源&#xff1a;2023-2024年汽车行业报告/方案合集&#xff08;精选345份&#xff09; 【以下是资料目录】 2023中国汽车科技50强 2023中国智能汽车产业发展与展望 2023比亚迪海豹汽车拆解报告 2023新能…

Layui中change事件不生效

1、问题概述? 在项目中给下拉框添加change事件,期望当select值发生变化的时候,触发事件。 问题:change事件不生效。 代码如下: 【select代码如下】 <div class="layui-inline"><label class="layui-form-label">请选择省</label&…

【Vue】通过vue-router实现页面跳转

一、准备工作 1、创建一个Vue-cli程序 博客链接&#xff1a;CSDN 2、安装vue-router npm install vue-router --save-dev 3、删除多余的东西 二、创建router 1、在src下创建router包 2、创建跳转的component 分别创建一个Content.vue和Main.vue文件 3、在router包下创建in…

十九、XML Extensible Markup Language

1、DTD简介 如果XML内容写错了怎么办? 如何校验XML语法的正确与否? 1)什么是DTD DTD(文档类型定义)可以定义合法的XML文档结构,它使用一系列合法元素来定义文档的结构。DTD分别为内部DTD和外部DTD,所谓内部DTD是指该DTD在某个文档的内部,只被该文档使用。外部DTD是指该DT…