时间:2021-05-20
我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子:
那个这个是怎么实现的呢?原因就在于它利用了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.配置类
@Configurationpublic 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的自动配置,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一)spring-boot-starter命名规则自动配置模块命名规则:xxx-spring-boot,如:aspectlog-spring-boot启动器命名
本文介绍了springboot的maven配置依赖详解,分享给大家,具体如下:我们通过引用spring-boot-starter-parent,添加spring
了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文
1.什么是spring-boot-devtoolsspring-boot-devtools是spring-boot项目开发时的一个热部署工具,安装了spring
1.加入mybatis-spring-boot-stater的Maven依赖org.mybatis.spring.bootmybatis-spring-boot