不管是 spring cloud alibaba 还是 spring cloud netflix,都
是基于 springboot 这个微框架来构建的,所以我希望花一
点时间来讲一下 springboot

什么是 springboot

对于 spring 框架,我们接触得比较多的应该是 spring mvc、
和 spring。而 spring 的核心在于 IOC(控制反转)和 DI
(依赖注入)。而这些框架在使用的过程中会需要配置大量
的 xml,或者需要做很多繁琐的配置。
springboot 框架是为了能够帮助使用 spring 框架的开发
者快速高效的构建一个基于 spirng 框架以及 spring 生态
体系的应用解决方案。它是对“约定优于配置”这个理念下
的一个最佳实践。因此它是一个服务于框架的框架,服务
的范围是简化配置文件。 

约定优于配置的体现

约定优于配置的体现主要是
1. maven 的目录结构
a) 默认有 resources 文件夹存放配置文件
b) 默认打包方式为 jar2. spring-boot-starter-web 中默认包含 spring mvc 相关
依赖以及内置的 tomcat 容器,使得构建一个 web 应用
更加简单
3. 默认提供 application.properties/yml 文件
4. 默认通过 spring.profiles.active 属性来决定运行环境时
读取的配置文件
5. EnableAutoConfiguration 默认对于依赖的 starter 进行
自动装载
 
从 SpringBootApplication 注解入手
为了揭开 springboot 的奥秘,我们直接从 Annotation 入
手,看看@SpringBootApplication 里面,做了什么?
打开 SpringBootApplication 这个注解,可以看到它实际上
是一个复合注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration -实际上是
@Configuration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type =
FilterType.CUSTOM, classes =
TypeExcludeFilter.class),
@Filter(type =
FilterType.CUSTOM,
classes =
AutoConfigurationExcludeFilter.clas
s) })
public @interface
SpringBootApplication { 
SpringBootApplication 本质上是由 3 个注解组成,分别是
1. @Configuration
2. @EnableAutoConfiguration
3. @ComponentScan
我们可以直接用这三个注解也可以启动 springboot 应用,
只是每次配置三个注解比较繁琐,所以直接用一个复合注
解更方便些。
然后仔细观察者三个注解,除了 EnableAutoConfiguration
可能稍微陌生一点,其他两个注解使用得都很多
简单分析@Configuration
Configuration 这个注解大家应该有用过,它是 JavaConfig形式的基于 Spring IOC 容器的配置类使用的一种注解。因
为 SpringBoot 本质上就是一个 spring 应用,所以通过这
个注解来加载 IOC 容器的配置是很正常的。所以在启动类
里面标注了@Configuration,意味着它其实也是一个 IoC
容器的配置类。
传统意义上的 spring 应用都是基于 xml 形式来配置 bean
的依赖关系。然后通过 spring 容器在启动的时候,把 bean
进行初始化并且,如果 bean 之间存在依赖关系,则分析这
些已经在 IoC 容器中的 bean 根据依赖关系进行组装。
直到 Java5 中,引入了 Annotations 这个特性,Spring 框
架也紧随大流并且推出了基于 Java 代码和 Annotation 元
信息的依赖关系绑定描述的方式。也就是 JavaConfig。
从 spring3 开始,spring 就支持了两种 bean 的配置方式,
一种是基于 xml 文件方式、另一种就是 JavaConfig
任何一个标注了@Configuration 的 Java 类定义都是一个
JavaConfig 配置类。而在这个配置类中,任何标注了
@Bean 的方法,它的返回值都会作为 Bean 定义注册到
Spring 的 IOC 容器,方法名默认成为这个 bean 的 id
 
简单分析 ComponentScan
ComponentScan 这个注解是大家接触得最多的了,相当
于 xml 配置文件中的<context:component-scan>。 它的主要作用就是扫描指定路径下的标识了需要装配的类,自
动装配到 spring 的 Ioc 容器中。
标识需 要装配的类的 形式主要是: @Component 、
@Repository、@Service、@Controller 这类的注解标识的类。
ComponentScan 默认会扫描当前 package 下的的所有加
了相关注解标识的类到 IoC 容器中; 
 
简单分析 EnableAutoConfiguration
我们把 EnableAutoConfiguration 放在最后讲的目的并不
是说它是一个新的东西,只是他对于 springboot 来说意义
重大。
Enable 并不是新鲜玩意
仍然是在 spring3.1 版本中,提供了一系列的@Enable 开
头的注解,Enable 主机应该是在 JavaConfig 框架上更进一
步的完善,是的用户在使用 spring 相关的框架是,避免配
置大量的代码从而降低使用的难度
比如常见的一些 Enable 注解:EnableWebMvc,(这个注
解引入了 MVC 框架在 Spring 应用中需要用到的所有
bean);
比如说@EnableScheduling,开启计划任务的支持;找到 EnableAutoConfiguration,我们可以看到每一个涉及
到 Enable 开头的注解,都会带有一个@Import 的注解。
@Import(AutoConfigurationImportSele
ctor.class)
public @interface
EnableAutoConfiguration { 
 
Import 注解
import 注解是什么意思呢? 联想到 xml 形式下有一个
<import resource/> 形式的注解,就明白它的作用了。
import 就是把多个分来的容器配置合并在一个配置中。在
JavaConfig 中所表达的意义是一样的。
 
深入分析 EnableAutoConfiguration
EnableAutoConfiguration 的 主 要 作 用 其 实 就 是 帮 助
springboot 应用把所有符合条件的@Configuration 配置
都加载到当前 SpringBoot 创建并使用的 IoC 容器中。
再回到 EnableAutoConfiguration 这个注解中,我们发现
它的 import 是这样
@Import(AutoConfigurationImportSele
ctor.class)public @interface
EnableAutoConfiguration {
AutoConfigurationImportSelector 是什么?
Enable注解不仅仅可以像前面演示的案例一样很简单的实
现多个 Configuration 的整合,还可以实现一些复杂的场
景,比如可以根据上下文来激活不同类型的 bean,
@Import 注解可以配置三种不同的 class
1. 第一种就是前面演示过的,基于普通 bean 或者带有
@Configuration 的 bean 进行诸如
2. 实现 ImportSelector 接口进行动态注入
3. 实现 ImportBeanDefinitionRegistrar 接口进行动态注入
 
@EnableAutoConfiguration 注解的实现原理
了解了 ImportSelector 和 ImportBeanDefinitionRegistrar
后,对于 EnableAutoConfiguration 的理解就容易一些了
它会通过 import 导入第三方提供的 bean 的配置类:
AutoConfigurationImportSelector
@Import(AutoConfigurationImportSele
ctor.class)从名字来看,可以猜到它是基于 ImportSelector 来实现
基于动态 bean 的加载功能。之前我们讲过 Springboot
@Enable*注解的工作原理 ImportSelector 接口
selectImports 返回的数组(类的全类名)都会被纳入到
spring 容器中。
那么可以猜想到这里的实现原理也一定是一样的,定位到
AutoConfigurationImportSelector 这个类中的
selectImports 方法
本质上来说,其实 EnableAutoConfiguration 会帮助
springboot 应用把所有符合@Configuration 配置都加载
到当前 SpringBoot 创建的 IoC 容器,而这里面借助了
Spring 框架提供的一个工具类 SpringFactoriesLoader 的
支持。以及用到了 Spring 提供的条件注解
@Conditional,选择性的针对需要加载的 bean 进行条件
过滤
 
SpringFactoriesLoader
为了给大家补一下基础,我在这里简单分析一下
SpringFactoriesLoader 这个工具类的使用。它其实和
java 中的 SPI 机制的原理是一样的,不过它比 SPI 更好的
点在于不会一次性加载所有的类,而是根据 key 进行加
载。首先, SpringFactoriesLoader 的作用是从
classpath/META-INF/spring.factories 文件中,根据 key 来
加载对应的类到 spring IoC 容器中。 
 
深入理解条件过滤
在分析 AutoConfigurationImportSelector 的源码时,会
先扫描 spring-autoconfiguration-metadata.properties
文件,最后在扫描 spring.factories 对应的类时,会结合
前面的元数据进行过滤,为什么要过滤呢? 原因是很多
的@Configuration 其实是依托于其他的框架来加载的,
如果当前的 classpath 环境下没有相关联的依赖,则意味
着这些类没必要进行加载,所以,通过这种条件过滤可以
有效的减少@configuration 类的数量从而降低
SpringBoot 的启动时间。
Conditional 中的其他注解

Springboot 基本认识的更多相关文章

  1. 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用

    问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...

  2. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  3. Springboot搭建web项目

    最近因为项目需要接触了springboot,然后被其快速零配置的特点惊呆了.关于springboot相关的介绍我就不赘述了,大家自行百度google. 一.pom配置 首先,建立一个maven项目,修 ...

  4. Java——搭建自己的RESTful API服务器(SpringBoot、Groovy)

    这又是一篇JavaWeb相关的博客,内容涉及: SpringBoot:微框架,提供快速构建服务的功能 SpringMVC:Struts的替代者 MyBatis:数据库操作库 Groovy:能与Java ...

  5. 解决 SpringBoot 没有主清单属性

    问题:SpringBoot打包成jar后运行提示没有主清单属性 解决:补全maven中的bulid信息 <plugin> <groupId>org.springframewor ...

  6. SpringBoot中yaml配置对象

    转载请在页首注明作者与出处 一:前言 YAML可以代替传统的xx.properties文件,但是它支持声明map,数组,list,字符串,boolean值,数值,NULL,日期,基本满足开发过程中的所 ...

  7. springboot 学习资源推荐

    springboot 是什么?对于构建生产就绪的Spring应用程序有一个看法. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.(这是springboot的官方介绍) 我们为什么要学 ...

  8. Springboot框架

    本片文章主要分享一下,Springboot框架为什么那么受欢迎以及如何搭建一个Springboot框架. 我们先了解一下Springboot是个什么东西,它是干什么用的.我是刚开始接触,查了很多资料, ...

  9. 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

    做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...

  10. 5分钟创建一个SpringBoot + Themeleaf的HelloWord应用

    第一步:用IDE创建一个普通maven工程,我用的eclipse. 第二步:修改pom.xml,加入支持SpringBoot和Themeleaf的依赖,文件内容如下: <?xml version ...

随机推荐

  1. 【.NET 与树莓派】矩阵按键

    欢迎收看火星卫视,本期节目咱们严重探讨一下矩阵按键. 所谓矩阵按键,就是一个小键盘(其实一块PCB板),上面有几个 Key(开关),你不按下去的时候,电路是断开的,你按下去电路就会接通.至于说有多少个 ...

  2. E1.获取Elixir/Erlang版本信息

    E1.获取Elixir/Erlang版本信息 获取Elixir版本 直接在shel中打开iex (interactive shell),就可以查到具体的版本信息: iex Erlang/OTP 22 ...

  3. 对象存储 COS 帮您轻松搞定跨域访问需求

    背景 早期为了避免 CSRF(跨站请求伪造) 攻击,浏览器引入了 "同源策略" 机制.如果两个 URL 的协议,主机名(域名/IP),端口号一致,则视为这两个 URL " ...

  4. JavaScript中创建数组的方式!

    JavaScript中创建数组的方式! 利用数组字面量 // 1 直接量 console.log(Array.prototype); var arr = [1, 2, 4, 87432]; // 注意 ...

  5. Linux下双网卡双ip-双外网网关-电信联通双线主机设置

    1.实现:通过运营商提供的智能DNS,把电信用户访问时,数据进电信的网卡,出来时也从电信的网关出来,访问联通时,从联通网卡时,联通网卡出.这样速度就会快,实现双线主机的功能. 2.网卡信息:电信IP( ...

  6. 一键配置 github 可用的 hosts

    最近发现访问 Github 各种不畅通, 静态资源经常加载不出来. 写了一个一键脚本修改本机 /etc/hosts 文件, 切换到可用的 IP (数据来自 https://gitee.com/xuew ...

  7. P2573 [SCOI2012]滑雪 题解

    下午花了三个小时肝这道题,心态差点爆炸! 下面是分析: 1 题目要求: 2 求最小生成树 3 但是 4 - a是从1号点开始的 --> 如果以后的某个点比一号高,则不可能到达 5 - a只能从高 ...

  8. Java面试(解答题二)

    1.一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户.备注:用户表:tb,角色字段为role,主键为id.请写出sql语句. 解答: 2.概述MVC体系结构 解答: MVC包括三类对 ...

  9. 一块网卡配2IP地址

    我们知道在Linux下网卡被称为eth0,eth1,eth2.....,所有网卡的配置文件都存储在 /etc/sysconfig/network-script/下,文件名是以ifcfg-eth0,if ...

  10. .Net Core 使用 CSRedisCore 访问 Redis 的哨兵和主从复制

    一.创建Redis服务 运行环境是Window,安装Redis请看:安装教程. 直接开始创建Redis服务,演示就创建两个一主一从,先把安装路径下的 redis.windows.conf 文件复制一份 ...