SpringBoot自动配置

  SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即可。

  Spring 4.0的条件化配置

  SpringBoot中包含一个spring-boot-autoconfigure的JAR文件,其中包含一应配置类。每个配置类都在应用程序的Classpath里,包括Thymeleaf/Spring Data JPA/Spring MVC等,开发者根据需求选择使用。

  自动配置-设计基础:Spring4.0引入的新特性--条件化配置。条件化配置允许配置存在于应用程序中,但在满足某些特定条件之前都忽略这些配置。

  在Spring里可以很方便地编写自定义的条件,只需要实现Condition接口,覆盖它的matches()方法。

  具体条件化配置使用示例:

/*** 具体条件类,需实现Condition接口,并重写matchs(.. , ..)方法
*/
public class JdbcTemplateCondition implements Condition {@Overridepublic boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {try{context.getClassLoader().loadClass("org.springframework.jdbc.core.JdbcTemplate");return true;} catch (Exception e){ return false; } } } --------------------------------------------------------------------- /** * 声明bean时,使用自定义条件类,作为@Conditional的参数value */ @Conditional(JdbcTemplateCondition.class) public MyService myService(){....}

  在这个例子中,只有当JdbcTemplateCondition类的条件成立时才会创建MyService这个Bean。即MyService Bean创建的条件是Classpath里有JdbcTemplate。否则,这个Bean的声明就会被忽略掉。

  Spring 4.0源码支持:

  @Conditional注解 + Condition接口

/*** Condition接口,编写自定义条件*/
public interface Condition {boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
---------------------------------------------------------------
/*** Conditional注解*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {Class<? extends Condition>[] value();
}

  spring-boot-autoconfigure实现分析

  上例相当简单,但SpringBoot定义了很多更有趣的条件,并将其运用到了配置类上,这些配置类构成了SpringBoot的自动配置。SpringBoot运用条件化配置的方法是,定义多个特殊的条件化注解,并将其用到配置类上。

  SpringBoot提供的条件化注解:

自动配置中使用的条件化注解
条件化注解 配置生效条件
@ConditionalOnBean 配置了某个特定Bean
@ConditionalOnMissingBean 没有配置特定的Bean
@ConditionalOnClass Classpath里有指定的类
@ConditionalOnMissingClass Classpath里缺少指定的类
@ConditionalOnExpression 给定的SpEL表达式计算结果为true
@ConditionalOnJava Java的版本匹配特定值或者一个范围值
@ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有参数,则需要JNDI InitialContext
@ConditionalOnProperty 指定的配置属性要有一个明确的值
@ConditionalOnResource Classpath里有指定的资源
@ConditionalOnWebApplication 这是一个Web应用程序
@ConditionalOnNotWebApplication 这不是一个Web应用程序

  源码剖析,DataSourceAutoConfiguration代码片段:

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class})
public class DataSourceAutoConfiguration {... ...  
  @Configuration  @ConditionalOnProperty(prefix = "spring.datasource", name = "jmx-enabled")  @ConditionalOnClass(name = "org.apache.tomcat.jdbc.pool.DataSourceProxy")  @Conditional(DataSourceAutoConfiguration.DataSourceAvailableCondition.class)  @ConditionalOnMissingBean(name = "dataSourceMBean")  protected static class TomcatDataSourceJmxConfiguration {       @Bean     public Object dataSourceMBean(DataSource dataSource) {        if (dataSource instanceof DataSourceProxy) {           try {              return ((DataSourceProxy) dataSource).createPool().getJmxPool();           }           catch (SQLException ex) {              logger.warn("Cannot expose DataSource to JMX (could not connect)");           }        }        return null;     }

  }    ... ...
}

  分析:DataSourceAutoConfiguration添加了@Configuration注解,它从其他配置类里导入了一些额外配置,本身也定义了一些Bean。最重要的是,DataSourceAutoConfiguration上添加了@ConditionalOnClass注解,要求Classpath中必须要有DataSource和EmbeddedDatabaseType。如果这两个类不存在,条件就不成立,DataSourceAutoConfiguration提供的配置都会被忽略掉。

  DataSourceAutoConfiguration里嵌入了一个 TomcatDataSourceJmxConfiguration 类,自动配置一个 dataSourceMBean Bean。

  TomcatDataSourceJmxConfiguration 使用了@Conditional注解,判断 DataSourceAvailableCondition 条件是否成立——要有一个DataSource Bean或者要自动配置创建一个。

  总结

  SpringBoot利用Spring 4.0提供的条件化配置支持,实现了自动配置。其它应用样例如下:

  1. 因为Classpath里有H2,所以会创建一个嵌入式的H2数据库Bean,类型为javax.sql.DataSource,JPA实现(Hibernate)需要它来访问数据库;
  2. 因为Classpath里有Hibernate(Spring Data JPA传递引入的)的实体管理器,所以自动配置会配置与Hibernate相关的Bean,包括Spring的LocalContainerEntityManagerFactoryBean和JpaVendorAdapter;
  3. 因为Classpath里有SpringDataJPA,所以它会自动配置为根据数据库的接口创建仓库实现;
  4. 因为Classpath里有Thymeleaf,所以Thymeleaf会配置为SpringMVC的视图,包括一个Thymeleaf的模板解析器、模板引擎及视图解析器。视图解析器会解析相对于Classpath根目录的 /templates目录里的模板;
  5. 因为Classpath里有SpringMVC(归功于Web起步依赖),所以会配置Spring的DispatcherServlet并启动SpringMVC;
  6. 因为这是一个Spring MVC Web应用程序,所以会注册一个资源处理器,把相对于Classpath根目录的 /static目录里的静态资源提供出来(还能处理 /public、/resources和 /META-INF/resources的静态内容);
  7. 因为Classpath里有Tomcat,所以会启动一个嵌入式的Tomcat容器,监听8080端口(默认)。

  Spring Boot自动配置承担起了配置Spring的重任,开发者只需专注于自己的应用程序即可。

转载于:https://www.cnblogs.com/nyatom/p/9051681.html

Spring Boot自动配置与Spring 条件化配置相关推荐

  1. Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用

    1. Spring Boot概述 Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品: 首页Spring Boot简介可以 ...

  2. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  3. Spring Boot自动配置原理

    要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中. 首先我们需要有一个组件,这个组件中的属性 ...

  4. Spring Boot - 自动配置实例解读

    文章目录 Pre 启用 debug=true输出自动配置 HttpEncodingAutoConfiguration 什么情况下,Spring Boot 会自动装配 HttpEncodingAutoC ...

  5. 芋道 Spring Boot 自动配置原理

    转载自  芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...

  6. Spring Boot 自动配置的 “魔法” 是如何实现的?

    转载自  Spring Boot 自动配置的 "魔法" 是如何实现的? Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数 ...

  7. 【Spring Boot实战】源码解析Spring Boot自动配置原理

    一.简介 Spring致力于让Java开发更简单,SpringBoot致力于让使用Spring进行Java开发更简单,SpringCloud致力于基于SpringBoot构建微服务生态圈,让微服务开发 ...

  8. 学习第三篇:【SpringBoot-Labs】芋道 Spring Boot 自动配置原理

    本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...

  9. spring boot自动配置

    首先,一般的java Web项目需要很多配置,web配置(web.xml).spring配置(默认叫applicationContext.xml),非常繁琐 而spring-boot-starter是 ...

最新文章

  1. 为了一个科研idea,博士生们连冥想、巫毒仪式都用上了
  2. LeetCode:64. 最小路径和
  3. 信息抽取(四)【NLP论文复现】Multi-head Selection和Deep Biaffine Attention在关系抽取中的实现和效果
  4. Python爬虫项目,获取所有网站上的新闻,并保存到数据库中,解析html网页等(未完待续)
  5. my task doorway - where is it parsed
  6. 《scikit-learn》《Kaggle》泰坦尼克数据集的试验
  7. sql azure 语法_Azure SQL –使用Azure自动化的索引表
  8. 20165222第三周作业
  9. Cisdem PDF Converter OCR使用教程:在 Mac 上将PDF 转换为 Word
  10. steamcommunity本地反代443端口/80端口被占用解决办法
  11. linetv_LINE TV台湾版
  12. Ubuntu18.04中cURL 77 错误:error setting certificate verify locations
  13. html5字体的格式转换,font字体
  14. Python:猴子分香蕉
  15. TPM设备管理之设备采购方法及注意事项
  16. HCNR200和HCNR201在电机驱动和电流回路中的应用
  17. 图灵机器人接口实现自动回复(web版)
  18. Swift使用UIImagePickerController 从相册选择图片、从相机选择图片
  19. java 一对多关系修改,java – EclipseLink以一对多关系生成重复条...
  20. mysql学生班级老师_MySQL全方位练习(学生表 教师表 课程表 分数表)

热门文章

  1. RiPro主题-子主题huzao-child V4.0简洁大气集成后台美化包
  2. wangeditor上传html,自定义上传事件
  3. 二、Linxu的目录结构
  4. Java快速入门学习笔记7 | Java语言中的类与对象
  5. oracle 高效函数,Oracle分组函数之高效的ROLLUP
  6. git版本回退:error: Your local changes to the following files would be overwritten by merge
  7. 微信广告任务平台源码运营版
  8. 想买基金,在哪个银行开户好呢?
  9. 技术MBA高科技企业的“宠儿”
  10. QQ连连看棋盘数组找法: