Spring Boot2.x-06Spring Boot基础-使用@Conditional注解根据特定的条件装配bean
文章目录
- 概述
- 例子
- Step1 实现Condition接口,重写matches方法
- Step2 在对应的@Bean上使用@Conditional注解
- 测试
- 其他相关的注解
概述
假设在某些特定的场景下,希望根据特定的条件去加载某个或某些bean,我们可以使用@Condtional注解, Spring 4.0的时候加入的这个注解。
例子
假设,我们在配置了数据库的几个属性时,才去实例化bean,否则不初始化这个bean。这个例子可能不太合适,权当理解这个注解的用法了
Step1 实现Condition接口,重写matches方法
package com.artisan.springbootmaster.conditional;import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;/****/
public class DatabaseCondtional implements Condition {/*** 数据库bean的装配条件** @param context 上下文* @param metadata 注释类型的元数据* @return true 装配Bean ,否则不装配*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {// 根据context取出对应的Env信息Environment environment = context.getEnvironment();// 判断属性文件是否存在对应的数据库配置return environment.containsProperty("datasource.driverName")&& environment.containsProperty("datasource.url")&& environment.containsProperty("datasource.username")&& environment.containsProperty("datasource.password");}
}
Step2 在对应的@Bean上使用@Conditional注解
package com.artisan.springbootmaster.conditional;import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;import javax.sql.DataSource;
import java.util.Properties;@Configuration
@PropertySource(value = "classpath:jdbc.properties",ignoreResourceNotFound = true)
public class Config {@Bean(name = "datasource" ,destroyMethod = "close")@Conditional(DatabaseCondtional.class)public DataSource initDataSource(@Value("${datasource.driverName}") String driver,@Value("${datasource.url}") String url,@Value("${datasource.username}") String username,@Value("${datasource.password}") String password){System.out.println("driver:" + driver + "\n url:" + url+ "\n username:" + username+ "\n password:" + password) ;Properties properties = new Properties();properties.setProperty("driver",driver);properties.setProperty("url",url);properties.setProperty("username",username);properties.setProperty("password",password);DataSource dataSource = null;try {dataSource = BasicDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}return dataSource;}
}
测试
package com.artisan.springbootmaster.conditional;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import javax.sql.DataSource;public class Test {public static void main(String[] args){ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);//DataSource dataSource = (DataSource) ctx.getBean("datasource");DataSource dataSource = ctx.getBean(DataSource.class);System.out.println("datasource:" + dataSource);}
}
结果
当我们修改掉某个属性后,DatabaseCondtional#matches方法肯定返回false, 按照推测,该bean不会被加载到IoC容器中,我们来验证下
将 datasource.driverName 改为 datasource.driverName1
重新测试,抛出了异常。
因为我们在获取bean的时候,IoC容器中并不存在该bean。
其他相关的注解
Spring Boot2.x-06Spring Boot基础-使用@Conditional注解根据特定的条件装配bean相关推荐
- Spring Boot2 系列教程(七)理解自动化配置的原理
Spring Boot 中的自动化配置确实够吸引人,甚至有人说 Spring Boot 让 Java 又一次焕发了生机,这话虽然听着有点夸张,但是不可否认的是,曾经臃肿繁琐的 Spring 配置确实让 ...
- SpringBoot之conditional注解
@Conditional介绍 首先我们先了解一下@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,需要注入的Bean满足给定条件才可 ...
- java 装配_JAVA入门[13]-Spring装配Bean
一.概要 Sping装配bean主要有三种装配机制: 在XML中进行显式配置. 在Java中进行显式配置. 隐式的bean发现机制和自动装配. 原则: 建议尽可能地使用自动配置的机制,显式配置越少越好 ...
- 第二章 装配Bean(Spring in action,3th)
第二章 装配Bean 创建应用对象之间协作关系的行为通常被称为装配(wiring),是依赖注入的本质. XML方式声明Bean ...
- @Conditional注解详解
在使用Spring框架开发应用的过程中,大家都知道使用Spring开发应用程序,我们应用程序中大多数的Bean都是通过Spring的IOC容器来管理.将Bean注入到Spring IOC容器中的方式多 ...
- Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入
文章目录 概述 @Autowired注解 @Autowired的匹配原则 @Autowired的 required 属性 使用@Primary 和@Qualifier消除@Autowired的歧义 @ ...
- Spring Boot2.x-04Spring Boot基础-使用注解装配bean
文章目录 概述 通过Java配置文件@Bean的方式定义Bean 通过注解扫描的方式(@Component/@ComponentScan)装配Bean 使用excludeFilters属性不让IoC加 ...
- Spring Boot2.x-03Spring Boot基础
文章目录 搭建Spring Boot开发环境 使用Spring Tool Suit 构建 使用 IntelliJ IDEA来构建 Spring Boot配置 入口类的main方法和@SpringBoo ...
- 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)
点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...
最新文章
- 科技热点思考:元宇宙发展及其风险挑战
- Tensorflow csv文件读写与分批训练
- 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d-2.0-x-2.0.2使用资源加载策略
- Warning: mysqli_connect()_php链接MySQL8.0_异常
- php 正则替换url参数,JavaScript正则获取地址栏中参数的方法分享
- 【Hadoop Summit Tokyo 2016】中型组织的数据基础设施架构:收集、存储和分析的技巧...
- python基础:re模块匹配时贪婪和非贪婪模式
- 超像素学习笔记(1)——概念及判别条件
- 485集线器 4口485集线器 4口485 HUB
- html进度条倒计时代码,html5+css3进度条倒计时动画特效代码【推荐】_html5教程技巧...
- group by column中的column与前面条件发生的错误的解决方案
- Oracle 的 表空间(Tablespace)、用户(User)、模式(Schema)
- Redis Srem 命令
- 俄罗斯方块人工智能 [ AI ]
- 曲线曲面积分总结归纳
- php实现国外邮箱,发送电子邮件 · 国外PHP框架Nette官网教程 · 看云
- 随笔感悟:程序员的“孩纸们”
- 破解360doc个人图书馆网站的右键、复制方法
- matlab取实部_matlab 计算行列式 出现复数解 无法使用real来获取实部? - 计算模拟 - 小木虫 - 学术 科研 互动社区...
- Lilypond开源打谱软件安装步骤
热门文章
- 图形界面不卡的linux,图形化界面linux(linaro)的安装小结
- wide_and_deep 思维导图和代码
- php 编辑器中使用短代码,php-在WooCommerce短代码输出中更改标记
- 只用位运算不用算术运算实现
- 深究 ElasticSearch 查询的秘密
- QListWidget读取本地文件夹中文件并显示名字,双击读取xml数据
- Python处理大数据量文本数据思路
- flink入门实战总结
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载...
- Spring 的优秀工具类盘点---转