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包

Spring boot中@Conditional和spring boot的自动配置实例详解 

条件化配置就是在这个jar里面实现的,它用到了如下的条件化注解,这些注解都是以@Conditional开头的:

Spring boot中@Conditional和spring boot的自动配置实例详解 

接下来我们看个源码的列子:

以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

标签:spring,boot,自动配置
0
投稿

猜你喜欢

  • 解决android 显示内容被底部导航栏遮挡的问题

    2021-08-05 10:10:55
  • Java实现查找当前字符串最大回文串代码分享

    2023-07-30 04:05:02
  • android中使用SharedPreferences进行数据存储的操作方法

    2023-06-16 17:37:42
  • Java中为什么start方法不能重复调用而run方法可以?

    2023-11-15 03:04:02
  • java使用EasyExcel导入导出excel

    2022-10-31 03:48:30
  • RxJava中多种场景的实现总结

    2023-01-09 05:39:02
  • Android自定义控件实现UC浏览器语音搜索效果

    2022-06-01 06:59:40
  • Android广播实现App开机自启动

    2023-01-06 14:54:44
  • IDEA中的.iml文件和.idea文件夹

    2023-11-23 11:47:19
  • Spring Security认证机制源码层探究

    2022-07-27 19:05:26
  • Android性能优化之线程监控与线程统一详解

    2023-11-24 07:38:50
  • C# Dynamic关键字之:调用属性、方法、字段的实现方法

    2022-09-22 04:23:39
  • swing登录注册界面设计

    2023-11-24 17:27:21
  • AndroidStudio 使用过程中出现的异常(Gradle sync failed)处理办法

    2022-03-18 21:46:43
  • Android组件必学之TabHost使用方法详解

    2021-11-12 04:56:47
  • Android实现EditText控件禁止输入内容的方法(附测试demo)

    2021-06-26 08:43:38
  • Java如何构造DSL方法重构

    2021-10-10 02:04:09
  • Android自定义控件之广告条滚动效果

    2022-01-27 05:57:45
  • 解决mybatis分页插件PageHelper导致自定义拦截器失效

    2023-10-13 07:24:29
  • java并发分段锁实践代码

    2021-10-08 04:55:45
  • asp之家 软件编程 m.aspxhome.com