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. mysql5.7 不复制多张表
  2. python在中小学教学中的应用-中小学Python编程语言教学
  3. 关于数据存储的经典题
  4. 1013 Battle Over Cities (25 分) 【难度: 中 / 知识点: 连通块】
  5. windbg学习-----n(Set Number base)
  6. python如何强制转换数据类型_python数据类型强制转换实例详解
  7. java设计模式 单例_java设计模式--单例模式
  8. linux使用指导-debian/archlinux/LFS
  9. java中的数组增删查改操作,java数组实现增删改查
  10. java读取properties文件详解
  11. 毕设-基于JavaWeb体育竞赛管理系统
  12. from_tensor_slices()
  13. mysql netbeans_关于netbeans与mysql连接问题
  14. ADSL自动更换IP的方法
  15. 12C -- 配置Application Continuity
  16. python模拟按键_Python在windows下模拟按键和鼠标点击代码
  17. css文字背景蒙版_使用CSS创建蒙版的背景效果
  18. 可能是最好的设计模式入门教程——里氏替换原则
  19. Python实现统一社会信用代码校验(GB32100-2015)
  20. Windows运行程序时桌面窗口卡死

热门文章

  1. 看书籍《欲罢不能》的几点感悟
  2. DAY01加强版的java自学
  3. 亿信华辰:一文详解数据标准管理
  4. 【转】MATLAB各种矩阵生成函数
  5. abb机器人--示教器--基础认识
  6. linux交互式进程初始化失败怎么办,登录进程初始化失败交互式登录进程初始化失败的解决办法...
  7. 主流蓝牙BLE MESH模块蓝牙芯片ic的选型总结经验
  8. 报错:“java.lang.RuntimeException:Some file crunching failed,see logs for details”
  9. C++程序设计原理与实践电子书pdf下载
  10. systemctl mask和systemctl disable有什么区别?