该篇为Sping Boot入门到实战系列入门篇的第四篇。介绍Spring Boot自动化配置的基本原理与实现。
 
  Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性。开发者需要使用某项功能,只需要引入对应的starter依赖包(Spring Boot官方提供了大量starter包),Spring Boot就能自动帮你准备好使用该项功能的条件。比如需要访问Redis, 只需要pom.xml中引入spring-boot-starter-redis依赖,Spring Boot将自动为你创建RedisTemplate 等bean,并默认以localhost作为redis连接地址。
 
  理解Spring Boot自动化配置实现原理,需要了解如下几个方面:
  1. @EnableAutoConfiguration注解
  2. SpringApplication类
  3. spring-boot-autoconfigure jar包
  4. spring.factories文件
 
  1. @EnableAutoConfiguration注解
  这个注解的作用是告诉Spring Boot基于添加的jar依赖来自动配置Spring,比如如果添加了spring-boot-starter-web依赖,则Spring Boot认为你在开发一个web应用,就会自动做好web相应配置。这个注解一般放在主类上。在前面的示例项目中, 我们在主类上都是使用@SpringBootApplication, 查看源码可以知道: @SpringBootApplication 这个注解实际上等效于 @SpringBootConfiguration(等效于@Configuration), @EnableAutoConfiguration, @ComponentScan 三者的组合。如果去掉@EnableAutoConfiguration注解,则Spring Boot将不会自动配置Spring(如实例化必要的Bean),将可能导致应用启动失败。
 
  2. SpringApplication类
  在应用主类中,我们是通过SpringApplication的run方法来启动应用的,如:

@SpringBootApplication
public class MyFirstSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(MyFirstSpringbootApplication.class, args);
}
}

  查看源码,SpringApplication的静态run方法,实际也是通过创建SpringApplication实例,调用实例方法执行,在SpringApplication构造器方法中,调用了getSpringFactoriesInstances 方法, 如下图

追溯下去,最终会调用到SpringFactoriesLoader的loadSpringFactories方法,如下图

  在该方法中,会从所有的META-INF目录下加载spring.factories文件里配置的所有工厂类名称(包括初始化器,监听器,自动配置类等)。然后上层方法中通过反射机制实例化这些工厂类,从而完成相应Bean的自动化配置与注入。

 
  3. spring-boot-autoconfigure jar包
  官方提供的starter,如spring-boot-starter-web, 都依赖了spring-boot-starter, 而spring-boot-starter又依赖了spring-boot-autoconfigure。 在spring-boot-autoconfigure中提供了大量官方提供的自动配置类,并且包含META-INFO/spring.factories文件,如下图

spring.factories文件内容如下图所示

红色框所标识部分的就是Spring Boot提供的大量自动配置类。

 
  Spring Boot通过这种自动化配置机制,以starter依赖包的方式,使开发者非常方便地使用项目开发中的许多常用功能,如数据库访问、缓存、队列等。同时,用户也可以根据自身需求,自定义自己的starter(这部分将在实战篇介绍)。
 
  Spring Boot自动化配置包含了许多条件类注解及顺序类注解,这些注解可方便地让自动化配置按照某种条件或者顺序进行配置。
  其中条件类注解包括:
  • 类级别条件注解

    • @ConditionalOnClass: 类路径中存在指定的类才进行该配置
    • @ConditionalOnMissingClass: 类路径中不存在指定的类才进行该配置
  • 实例级别条件注解

    • @ConditionalOnBean:只有在当前上下文中存在指定Bean时,才进行该配置
    • @ConditionalOnMissingBean: 只有在当前上下文不存在指定Bean时,才进行该配置
  • 属性级别条件注解

    • @ConditionalOnProperty:当存在某个指定属性,且值为指定值时,才进行该配置
  • 资源级别条件注解

    • @ConditionalOnResource:在类路径下存在指定的Resource时,才进行配置
  • Web应用条件注解

    • @ConditionalOnWebApplication:该应用为Web应用时进行该配置
    • @ConditionalOnNotWebApplication: 该应用不为Web应用时进行该配置
  • SpEL( Spring Expression Language)表达式注解

    • @ConditionalOnExpression: 计算SpEL表达式值,值为true时才进行该配置
 
  顺序类注解包括:
  • @AutoConfigureAfter: 在指定的配置类初始化后再加载
  • @AutoConfigureBefore: 在指定的配置类初始化前加载
  • @AutoConfigureOrder: 数值越小越先初始化
 
  注意:自动配置类不应该位于组件扫描路径(@ComponentScan注解指定的扫描路径)下,否则上述条件注解与顺序注解可能不会生效。建议只在自动配置的类上注解@ConditionalOnBean and @ConditionalOnMissingBean,因为这可以保证在用户定义bean已经添加到ApplicationContext之后才会加载。这两个注解放在class上,则相当于class里面每一个@Bean标注的方法都加上了。
 
 
 
 
 
 

Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置的更多相关文章

  1. Sping Boot入门到实战之入门篇(三):Spring Boot属性配置

    该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置.   传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...

  2. Sping Boot入门到实战之入门篇(一):Spring Boot简介

    该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...

  3. Sping Boot入门到实战之入门篇(二):第一个Spring Boot应用

    该篇为Spring Boot入门到实战系列入门篇的第二篇.介绍创建Spring Boot应用的几种方法. Spring Boot应用可以通过如下三种方法创建: 通过 https://start.spr ...

  4. xgboost入门与实战(原理篇)

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  5. Spring Boot入门篇(基于Spring Boot 2.0系列)

    1:概述: Spring Boot是用来简化Spring应用的初始化开发过程. 2:特性: 创建独立的应用(jar|war形式); 需要用到spring-boot-maven-plugin插件 直接嵌 ...

  6. Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务

    Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...

  7. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  8. [Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权

    一. 前言 本篇实战案例基于 youlai-mall 项目.项目使用的是当前主流和最新版本的技术和解决方案,自己不会太多华丽的言辞去描述,只希望能勾起大家对编程的一点喜欢.所以有兴趣的朋友可以进入 g ...

  9. Spring Cloud实战 | 最八篇:Spring Cloud +Spring Security OAuth2+ Axios前后端分离模式下无感刷新实现JWT续期

    一. 前言 记得上一篇Spring Cloud的文章关于如何使JWT失效进行了理论结合代码实践的说明,想当然的以为那篇会是基于Spring Cloud统一认证架构系列的最终篇.但关于JWT另外还有一个 ...

随机推荐

  1. ActiveMQ入门练习

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久 ...

  2. android studio获取sha1签名

    转载 :http://blog.csdn.net/kezhongke/article/details/42678077

  3. Apache Traffic Server服务搭建

    一.简介 Apache Traffic Server(ATS或TS)是一个高性能的.模块化的HTTP代理和缓存服务器,与 Nginx 和 Squid 类似.它通过将频繁访问的信息缓存在网络的边缘来改善 ...

  4. python3操作pymsql模块

    pymysql是python中操作mysql的模块. 1.pymysql模块的安装 pip3 install pymysql 也可以使用pycharm这个IDE工具来安装pymysql这个模块. 2. ...

  5. ABP官方文档翻译 6.5 内嵌资源文件

    内嵌资源文件 介绍 创建内嵌文件 xproj/project.json形式 csproj形式 添加内嵌资源管理器 使用内嵌视图 使用内嵌资源 ASP.NET Core 配置 忽略文件 重写内嵌文件 介 ...

  6. 豹哥嵌入式好讲堂:ARM Cortex-M调试过程探析(1)- 4线接口标准(JTAG)

    大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式调试里的接口标准JTAG. 在结束<ARM Cortex-M开发文件详解>系列文章之后,豹哥修整了一小段时间,但是讲课的心 ...

  7. gitlab wiki 500

    记录一次使用gitlab各种报500的问题,并怎么解决的描述下 一.问题背景 描述我第一次使用wiki的步骤: 二.问题描述 之后我进行任何合法的操作(创建页面使用全英文名称:页面不做任何修改,只是点 ...

  8. ubuntu14.04上实现faster rcnn_TF的demo程序及训练过程

    安装环境:Ubuntu14.04.显卡Tesla K40C+GeForce GT 705.tensorflow1.0.0.pycharm5.0 说明:原文见博客园,有问题原文下留言,不定期回复.本文作 ...

  9. Redis 持久化和配置文件

    Reids 持久化 Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File).   RDB,简而言之,就是在不同的时间点,将redis ...

  10. jq模仿雨滴下落的动画

    效果如图: 实现思路:定时器每隔x秒生成宽高.下落速度(即动画执行时间).left随机的div. 1.CSS: body{ overflow: hidden;/*这是为了防止出现滚动条*/ } .co ...