Spring boot中@Conditional和spring boot的自动配置实例详解
我们知道,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的自动配置,希望对大家有所帮助
推荐阅读
-
Spring boot中@Conditional和spring boot的自动配置实例详解
-
Spring Boot整合mybatis并自动生成mapper和实体实例解析
-
spring boot+vue 的前后端分离与合并方案实例详解
-
Spring Boot 配置随机数的技巧代码详解
-
详解Spring Boot下Druid连接池的使用配置分析
-
Spring boot进行参数校验的方法实例详解
-
详解Spring Boot 中实现定时任务的两种方式
-
spring boot Logging的配置以及使用详解
-
Spring Boot整合mybatis并自动生成mapper和实体实例解析
-
spring boot application properties配置实例代码详解