Spring Boot的基本认识

不管是Spring Cloud Alibaba还是Spring Cloud Netflix,都是基于Spring Boot 这个微框架来构建的。本篇只对Spring Boot做一个基本认知。后续会对Spring 的自动装配做详细的源码分析。另外推荐小马哥的《Spring Boot 编程思想》(核心篇)。对Spring Boot 做了详尽的分析。

什么是Spring Boot

对于Spring框架,我们接触得比较多的应该是Spring MVC和Spring。而Spring的核心在于IOC(控制反转)和DI(依赖注入)。而这些框架在使用的过程中会需要配置大量的xml,或者需要做很多繁琐的配置。

Spring Boot框架是为了能够帮助使用Spring框架的开发者快速高效的构建一个基于Spring框架以及Spring生态体系的应用解决方案。它是对”约定由于配置“这个理念下的一个最佳实践。因此它是一个服务于框架的框架,服务的范围是简化配置文件。

约定由于配置的体现

  1. Maven的目录结构

    • 默认由resources文件夹存放配置文件。
    • 默认打包方式为jar。
  2. spring-boot-starter-web中默认包含Spring MVC相关依赖以及内置的tomcat容器,使得构建一个web应用更加简单。
  3. 默认提供application.properties/yml文件。
  4. 默认通过spring.profiles.active属性来决定运行环境时独缺的配置文件。
  5. EnableAutoConfiguration默认对于依赖的starter进行自动装载。

从SpringBootApplication注解入手

为了揭开Spring Boot的奥秘,我们直接从Annotation入手,看着@SpringBootApplication里面,做了什么?

打开SpringBootApplication这个注解,可以看到它实际上是一个复合注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@ConfigurationPropertiesScan
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*并不是新东西

仍然是在Spring 3.1版本中,提供了一系列的@Enable开头的注解,@Enable开头的注解应该是在JavaConfig框架上更进一步的完善,使用户在使用Spring相关的框架时,避免配置大量的代码从而降低使用的难道。

比如常见的一些@Enable注解:@EnableWebMvc(这个注解引入了MVC框架在Spring应用中需要用到的所有Bean)。

比如@EnableScheduling,开支计划任务的支持。

找到EnableAutoConfiguration,我们可以看到每一个设计到@Enable开头的注解,都会带有一个@Import的注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

Import注解

xml形式下有一个<improt resource/>标签,@Import就是和这个标签的作用是一样的。可以把多个分开的配置合并在一个配置中。

深入分析@EnableAutoConfiguration

@EnableAutoCOnfiguration的主要作用其实就是帮助Spring Boot应用把所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器中。

在回到@EnableAutoConfiguration这个注解中,我们发现它的import是这样的:

@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

AutoConfigurationImportSelector

@Enable注解不仅仅可以很简单的实现多个Configuration的整合,还可以实现一些复杂的场景,比如可以根据上下文来激活不同类型的Bean,@Import注解可以配置三种不同的class:

  1. 第一种就是前面演示过的,基于普通Bean或者带有@Configuration的Bean进行注入。
  2. 实现ImportSelector接口进行动态注入。
  3. 实现ImprotBeanDefinitionRegistrar接口进行动态注入。
@EnableAutoConfiguration注解实现原理

了解了ImportSelector和ImprotBeanDefinitionRegistrar后,对于@EnableAutoConfiguration的理解就容易一些了。 它会通过improt导入第三方提供的Bean配置类:

@Import(AutoConfigurationImportSelector.class)

从名字来看,可以猜到它是基于ImportSelector来实现基于动态Bean的加载功能。之前我们讲过ImportSelector接口selectImports方法返回的数组(类的全类名)都会被纳入到Spring容器中。

那么可以猜想到这里的实现原理也是一样的,定位到AutoConfigurationImportSelector这个类中的selectImport方法:

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

这里返回的数组就是需要纳入到Spring IOC容器中的类。

本质上说,其实EnableAutoConfiguration会帮助Spring Boot应用把所有符合@Configuration配置都加载到当前SpringBoot创建的IOC容器,而这里面借助了Spring框架提供的一个工具类SpringFactoriesLoader的支持。以及用到了Spring提供的条件注解。

@Conditional,选择性的针对需要加载的Bean进行条件过滤

SpringFactoriesLoader

SpringFactoriesLoader其实和Java中的SPI机制的原理是一样的,不过它比SPI更好的点在于不会一次性加载所有的类,而是根据key进行加载。

首先,SpringFactoriesLoader的作用是从classpath/META-INF/spring.factories文件中,根据key来加载对应的累到Spring IOC容器中。

深入理解条件过滤

AutoConfigurationSelector的源码实现中,会先扫描Spring-autoconfiguration-metadata.properties文件,最后在扫描spring.factories对应的类,会结合前面的元数据进行过滤,为什么要过滤呢?原因是很多的@Configuration其实是依托于其他的框架来加载的,如果当前的classpath环境下没有相关的依赖,则意味着这些类没必要进行加载,所以,通过这种条件过滤可以有效的减少@Configuration类的数量从而降低SpringBott的启动时间。

Conditional中的其他注解
Conditions 描述
@ConditionalOnBean IOC容器中存在某个Bean的时候
@ConditionalOnMissBean IOC容器中不存在某个Bean的时候
@ConditionalOnClass 当前classpath可以找到某个类时
@ConditionalOnMissClass 当前classpath不可以找到某个类时
@ConditionalOnResource 当前 classpath 是否存在某个资源文件
@ConditionalOnProperty 当前 jvm 是否包含某个系统属性为某个值
@ConditionalOnWebApplication 当前 spring context 是否是 web 应用程序

什么是Starter

Strater是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境(条件)进行自动配置。使用者只需要依赖响应功能的Starter,无需做过多的配置和依赖,SpringBoot就能自动扫描并加载相应的模块。


http://www.taodudu.cc/news/show-4999186.html

相关文章:

  • writing Typecho Plugin记录
  • 死磕Spring源码-常见底层核心注解
  • 手写代码,简单实现Spring框架
  • work2vec的实战应用
  • 解决docker下安装redis后,RedisDesktopManager可以链接,但是springboot项目不能链接的问题
  • win10出现的各种问题
  • 冒险岛SF登录器
  • 冒险岛服务器租用需要考虑哪些因素?
  • 米米143V15-1/冒险岛143服务端/米米143/米米冒险岛143服务端V15 本地授权
  • 冒险岛143服务端/米米143/米米冒险岛143服务端
  • 冒险岛教程一:修改封包加解密(AES_OFB)
  • 关于冒险岛封包拦截程序的开发计划
  • 冒险岛数据封包分网站源程序析
  • 冒险岛私服启动程序--解决无静态IP的问题
  • 大数据毕业设计 机器学习股票数据量化分析与预测系统 - python
  • 冒险岛无敌挂小思路
  • 冒险岛内置全任务脚本爽歪歪外挂
  • ctf中MD5绕过详细总结及例题[BJDCTF2020]Easy MD5
  • php md5转明文,【转载】PHP明文加密
  • php md5加密成字符串,如何使用php进行字符串的md5加密
  • md5 php 漏洞,PHP实现MD5密码加盐处理
  • 还愁不能解密MD5值?简单代码就能实现md5加密解密,内附源码,亲测可用
  • 在线php md5,md5.php
  • go md5加密解密_PHP 代码加密实践
  • 用php实现md5解密源码,亲测可用
  • GNSS静态解算,RTKLib Rinex格式转换
  • burp Fiddler抓包软件
  • 跨平台抓包软件Charles笔记
  • 软件测试必备技能:抓包(一)
  • 爬虫从入门到精通(19) |安卓手机端抓包软件VNET介绍

01-Spring Boot的基本认识相关推荐

  1. scheduled 一秒钟执行一次_spring boot的Scheduled帮你实现定时任务,spring boot实践(11)...

    01 spring boot读取配置信息 02 多环境配置 03 处理全局异常 04 spring boot admin 05 spring mvc + mybatis 06 spring boot ...

  2. springboot templates读取不到_整合spring mvc + mybatis,其实很简单,spring boot实践(5)

    01 spring boot读取配置信息 02 多环境配置 03 处理全局异常 04 spring boot admin 主要通过spring boot整合spring mvc 以及mybatis实现 ...

  3. 全局配置_配置全局异常处理,结果没有想到,spring boot实践(3)

    01 spring boot读取配置信息 02 多环境配置 这个功能详细大家在项目中也经常遇到,通常我们在写controller的时候会定义一个全局的异常处理.任何的controller出现异常都会进 ...

  4. 【Bug档案01】Spring Boot的控制器+thymeleaf模板 -使用中出现静态资源加载路径不当的问题 -解决时间:3h

    [Bug档案01]Spring Boot的控制器+thymeleaf模板 -使用中出现静态资源加载路径不当的问题 -解决时间:3h 参考文章: (1)[Bug档案01]Spring Boot的控制器+ ...

  5. Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目01

    文章目录 概述 使用Spring Tool Suite构建Spring Boot项目 下载STS 插件安装 搭建第一个Spring Boot项目 启动项目 概述 通常,构建一个Spring Boot项 ...

  6. Vue + Spring Boot 学习笔记01:实现用户登录功能

    Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...

  7. 【Spring-Boot】【入门 01】第一个 Spring Boot 程序

    文章目录 一.SpringBoot入门 1. SpringBoot简介 2.微服务 3.Spring Boot 的基础知识 4.环境约束 5.环境配置 maven设置 IDEA设置 二.创建一个Hel ...

  8. 第十篇:Spring Boot整合mybatis+逆向工程(Mysql+Oracle) 入门试炼01

    1.添加pom依赖 <dependencies><!--springboot web 启动器--><dependency><groupId>org.sp ...

  9. Spring Boot基础学习笔记01:Spring Boot入门程序

    文章目录 零.学习目标 1.了解Spring Boot框架的优点 2.掌握使用Maven方式构建Spring Boot项目 3.掌握使用Spring Initializr方式构建Spring Boot ...

  10. Spring Boot 学习系列(01)—从0到1,只需两分钟

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 快速构建 如果我们想基于spring mvc 提供一个简单的API查询服务,传统的方式,首先需要我们引入sp ...

最新文章

  1. JS 缓存 设置临时缓存和长期缓存 sessionStorage localStorage
  2. python入门教程共四本书籍-关于 Python 的经典入门书籍有哪些?
  3. leetcode-合并两个有序链表
  4. 为什么学习C语言这么久,看的懂代码,做不出题,写不出来项目?
  5. 数据仓库之电商数仓-- 4、可视化报表Superset
  6. php短网址案例,php生成短网址原理与实例
  7. Java读取excel文件 将Excel文件变为二维String数组 .
  8. 中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云-接收和发送数据)
  9. 小知识---批量修改文件名后缀
  10. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)...
  11. SOLIDWORKS 2021 SP5.0 安装教程
  12. 2020年用于测试自动化的7种顶级编程语言
  13. php工具箱升级MySQL
  14. WEB前端技能考核内容及岗位要求
  15. SpringBoot发送电子邮件(附源码)
  16. 吴恩达机器学习18-应用实例:图片文字识别
  17. python实现multi函数参数个数不限、返回所有参数乘积_实现multi()函数,参数个数不限,返回所有参数的乘积。_学小易找答案...
  18. 威海海燕计算机学校,与中成学校一起成长 ——高海燕
  19. 三种男性最需要的营养素
  20. ERC20接口下USDT代币的深入解析

热门文章

  1. 代码随想录训练营day42
  2. 皮皮安学Java第二十六天
  3. 鸿蒙系统操作界面布局,华为鸿蒙操作系统大曝光
  4. 简易计算器+组合和内部
  5. 芯片服务器培训,服务器介绍及培训.ppt
  6. 雷达感应模组,自动播放讲解仪雷达应用,雷达传感器技术
  7. GeoServer入门学习:02-安装部署
  8. 【maven】pom配置:用overlays合并多个war
  9. html中的disabled属性的使用方式
  10. 胡锡进谈“996工作制”:不怕加班,但请把加班费给足了!