文章目录

  • 概述
  • 例子
    • 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相关推荐

  1. Spring Boot2 系列教程(七)理解自动化配置的原理

    Spring Boot 中的自动化配置确实够吸引人,甚至有人说 Spring Boot 让 Java 又一次焕发了生机,这话虽然听着有点夸张,但是不可否认的是,曾经臃肿繁琐的 Spring 配置确实让 ...

  2. SpringBoot之conditional注解

    @Conditional介绍 首先我们先了解一下@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,需要注入的Bean满足给定条件才可 ...

  3. java 装配_JAVA入门[13]-Spring装配Bean

    一.概要 Sping装配bean主要有三种装配机制: 在XML中进行显式配置. 在Java中进行显式配置. 隐式的bean发现机制和自动装配. 原则: 建议尽可能地使用自动配置的机制,显式配置越少越好 ...

  4. 第二章 装配Bean(Spring in action,3th)

                                         第二章 装配Bean 创建应用对象之间协作关系的行为通常被称为装配(wiring),是依赖注入的本质. XML方式声明Bean ...

  5. @Conditional注解详解

    在使用Spring框架开发应用的过程中,大家都知道使用Spring开发应用程序,我们应用程序中大多数的Bean都是通过Spring的IOC容器来管理.将Bean注入到Spring IOC容器中的方式多 ...

  6. Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入

    文章目录 概述 @Autowired注解 @Autowired的匹配原则 @Autowired的 required 属性 使用@Primary 和@Qualifier消除@Autowired的歧义 @ ...

  7. Spring Boot2.x-04Spring Boot基础-使用注解装配bean

    文章目录 概述 通过Java配置文件@Bean的方式定义Bean 通过注解扫描的方式(@Component/@ComponentScan)装配Bean 使用excludeFilters属性不让IoC加 ...

  8. Spring Boot2.x-03Spring Boot基础

    文章目录 搭建Spring Boot开发环境 使用Spring Tool Suit 构建 使用 IntelliJ IDEA来构建 Spring Boot配置 入口类的main方法和@SpringBoo ...

  9. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

最新文章

  1. 科技热点思考:元宇宙发展及其风险挑战
  2. Tensorflow csv文件读写与分批训练
  3. 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d-2.0-x-2.0.2使用资源加载策略
  4. Warning: mysqli_connect()_php链接MySQL8.0_异常
  5. php 正则替换url参数,JavaScript正则获取地址栏中参数的方法分享
  6. 【Hadoop Summit Tokyo 2016】中型组织的数据基础设施架构:收集、存储和分析的技巧...
  7. python基础:re模块匹配时贪婪和非贪婪模式
  8. 超像素学习笔记(1)——概念及判别条件
  9. 485集线器 4口485集线器 4口485 HUB
  10. html进度条倒计时代码,html5+css3进度条倒计时动画特效代码【推荐】_html5教程技巧...
  11. group by column中的column与前面条件发生的错误的解决方案
  12. Oracle 的 表空间(Tablespace)、用户(User)、模式(Schema)
  13. Redis Srem 命令
  14. 俄罗斯方块人工智能 [ AI ]
  15. 曲线曲面积分总结归纳
  16. php实现国外邮箱,发送电子邮件 · 国外PHP框架Nette官网教程 · 看云
  17. 随笔感悟:程序员的“孩纸们”
  18. 破解360doc个人图书馆网站的右键、复制方法
  19. matlab取实部_matlab 计算行列式 出现复数解 无法使用real来获取实部? - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  20. Lilypond开源打谱软件安装步骤

热门文章

  1. 图形界面不卡的linux,图形化界面linux(linaro)的安装小结
  2. wide_and_deep 思维导图和代码
  3. php 编辑器中使用短代码,php-在WooCommerce短代码输出中更改标记
  4. 只用位运算不用算术运算实现
  5. 深究 ElasticSearch 查询的秘密
  6. QListWidget读取本地文件夹中文件并显示名字,双击读取xml数据
  7. Python处理大数据量文本数据思路
  8. flink入门实战总结
  9. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载...
  10. Spring 的优秀工具类盘点---转