Spring boot中@Conditional和spring boot的自动配置实例详解
作者:JAVA开发老菜鸟 发布时间:2023-06-20 09:36:14
我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子:
Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean
Thymeleaf是不是在Classpath里面?如果是,则自动配置Thymeleaf的模板解析器、视图解析器、模板引擎
那个这个是怎么实现的呢?原因就在于它利用了Spring的条件化配置,条件化配置允许配置存在于应用中,但是在满足某些特定条件前会忽略这些配置。
要实现条件化配置我们要用到@Conditional条件化注解。接下来写个小例子来感受下@Conditional是怎么工作的。
一、@Conditional小例子
我们知道在windows下显示列表的命令是dir,而在linux系统下显示列表的命令是ls,基于条件配置,我们可以实现在不同的操作系统下返回不同的值。
1.判断条件定义
1.)windows下的判定条件
/**
* 实现spring 的Condition接口,并且重写matches()方法,如果操作系统是windows就返回true
*
*/
public class WindowsCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Windows");
}
}
2.)linux下的判定条件
/**
* 实现spring 的Condition接口,并且重写matches()方法,如果操作系统是linux就返回true
*
*/
public class LinuxCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Linux");
}
}
2.不同系统下的Bean的类
1.)接口
public interface ListService {
public String showListLine();
}
2.)windows下的Bean类
public class WindowsListService implements ListService{
@Override
public String showListLine() {
return "dir";
}
}
3.)linux下的Bean的类
public class LinuxListService implements ListService{
@Override
public String showListLine() {
return "ls";
}
}
3.配置类
@Configuration
public class ConditionConfig {
/**
* 通过@Conditional 注解,符合windows条件就返回WindowsListService实例
*
*/
@Bean
@Conditional(WindowsCondition.class)
public ListService windonwsListService() {
return new WindowsListService();
}
/**
* 通过@Conditional 注解,符合linux条件就返回LinuxListService实例
*
*/
@Bean
@Conditional(LinuxCondition.class)
public ListService linuxListService() {
return new LinuxListService();
}
}
4.测试类
public class ConditionTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);
ListService listService = context.getBean(ListService.class);
System.out
.println(context.getEnvironment().getProperty("os.name") + " 系统下的列表命令为: " + listService.showListLine());
}
}
5.运行测试类,由于我的是windows7 系统,因此结果是
Windows 7 系统下的列表命令为: dir
如果你的是linux系统,则结果就会是
Linux 系统下的列表命令为: ls
二、spring boot 的条件化配置
在spring boot项目中会存在一个名为spring-boot-autoconfigure的jar包
条件化配置就是在这个jar里面实现的,它用到了如下的条件化注解,这些注解都是以@Conditional开头的:
接下来我们看个源码的列子:
以JdbcTemplateAutoConfiguration为例,它里面有这段代码:
@Bean
@Primary
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(this.dataSource);
}
只有在不存在JdbcOperations(如果查看JdbcTemplate的源码,你会发现JdbcTemplate类实现了JdbcOperations接口)实例的时候,才会初始化一个JdbcTemplate 的Bean。
基于以上内容,我们就可以阅读自动配置相关的源码了。
总结
以上所述是小编给大家介绍的Spring boot中@Conditional和spring boot的自动配置网站的支持!
来源:http://www.cnblogs.com/sam-uncle/p/9104256.html


猜你喜欢
- 最近项目中用到了文字图标的按钮,需要居中显示,如果用TextView实现的方式,必须同时设置padding和drawablePadding。
- global 是 C# 2.0 中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它。假设你现在写了一个类,名字叫 System。
- 一.概述先给大家看一下效果图:点击中间的显示弹框按钮,从底部弹出来一个对话框,用户可以点击拍照或者从相册选择进行相应的操作,下面看看怎么实现
- ThreadLocal简介变量值的共享可以使用public static的形式,所有线程都使用同一个变量,如果想实现每一个线程都有自己的共享
- 一、背景假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。因此我们就需要找到一种方法来解决这个问题。二、解决
- 该工具包含是封装了jedis,包含redis.properties和jedisPool,序列化使用的是protostuff,map类型操作使
- 目录什么是树形结构数据效果用法源码总结什么是树形结构数据效果用法String jsonStr = "{\"name\&q
- 前言之前我们探讨过一个.class文件是如何被加载到jvm中的。但是jvm内又是如何划分内存的呢?这个内被加载到了那一块内存中?jvm内存划
- 本文实例讲述了Spring实战之协调作用域不同步的Bean操作。分享给大家供大家参考,具体如下:一 配置<?xml version=&
- 前言目前Google已经发布了Android13的正式版,虽然国内的手机能用上Android13还有一段时间,不过开发者们可以通过模拟器来体
- 如下所示://判断整数(int)private boolean isInteger(String str) {if (null == str
- 记得在学习数据结构的时候一味的想用代码实现算法,重视的是写出来的代码有一个正确的输入,然后有一个正确的输出,那么就很满足了。从网上看了许多的
- 需求有一个固定URL的文件,服务器端程序会定期的更新这个文件,现在需要写一个工具来监控这个文件的变化。解决办法最初我想到的是把这个文件下载下
- 问题提出:自己在做一个小网站充当练手,但是前端图片经过base64加密后传往后端在解码。但是一直都有问题,请大神赐教 publi
- 本文实例讲述了C#使用xsd文件验证XML格式是否正确的实现方法。分享给大家供大家参考,具体如下://创建xmlDocumentXmlDoc
- 今天去某在线教育面试面试官让做的一道题,题目描述如下:给定一个不重复的无序数组arr和一个定值num查找arr中是否有两个数的和等于num有
- 前言Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其
- 本教程为大家分享了学籍管理系统的具体java代码,供大家参考,具体内容如下1.需求分析 1.1系统功能设计 (1)能够查询学生的基本信息,如
- 本文通过实例详细阐述了C++关于智能指针的概念及用法,有助于读者加深对智能指针的理解。详情如下:一、简介由于 C++ 语言没有自动内存回收机
- java.math包提供了java中的数学类。包括基本的浮点库、复杂运算以及任意精度的数据运算提供用于执行任意精度整数算法 (BigInte