文章目录
- 1.SpringBoot简介- 2.详细介绍- - 2.1 SpringBoot的父项目- 3.2 SpringBoot的Starter- 2.3 引导类- - 2.3.1 @SpringBootConfiguration- 2.3.2 @EnableAutoConfiguration- 2.3.3 @ComponentScan- 3.面试题
1.SpringBoot简介
Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。学习框架就是学习配置
简单来说,它提供了一堆依赖打包Starter,并已经按照使用习惯解决了依赖问题—习惯大于约定。Spring Boot默认使用tomcat作为服务器,使用logback提供日志记录。无需多言,直接进入节奏.
spring boot 致力于简洁,让开发者写更少的配置,程序能够更快的运行和启动。它是下一代javaweb框架,并且它是spring cloud(微服务)的基础。约定大于配置
2.详细介绍
2.1 SpringBoot的父项目
SpringBoot将所有的技术版本的常见使用方案都给开发者整理了出来,以后开发者使用时直接用它提供的版本方案,就不用担心冲突问题了,相当于SpringBoot做了无数个技术版本搭配的列表,这个技术搭配列表的名字叫做parent。
parent自身具有很多个版本,每个parent版本中包含有几百个其他技术的版本号,不同的parent间使用的各种技术的版本号有可能会发生变化。当开发者使用某些技术时,直接使用SpringBoot提供的parent就行了,由parent帮助开发者统一的进行各种技术的版本管理。
比如你现在要使用Spring配合MyBatis开发,没有parent之前怎么做呢?选个Spring的版本,再选个MyBatis的版本,再把这些技术使用时关联的其他技术的版本逐一确定下来。当你Spring的版本发生变化需要切换时,你的MyBatis版本有可能也要跟着切换,关联技术呢?可能都要切换,而且切换后还可能出现其他问题。现在这一切工作都可以交给parent来做了。你无需关注这些技术间的版本冲突问题,你只需要关注你用什么技术就行了,冲突问题由parent负责处理。
有人可能会提出来,万一parent给我导入了一些我不想使用的依赖怎么办?记清楚,这一点很关键,parent仅仅帮我们进行版本管理,它不负责帮你导入坐标,说白了用什么还是你自己定,只不过版本不需要你管理了。整体上来说,使用parent可以帮助开发者进行版本的统一管理。
关注:parent定义出来以后,并不是直接使用的,仅仅给了开发者一个说明书,但是并没有实际使用,这个一定要确认清楚。
项目中的pom.xml中继承了一个坐标
打开后可以SpringBoot父项目到其中又继承了一个坐标
这个
spring-boot-dependencies
中定义了两组信息
第一组是各式各样的依赖版本号属性,下面列出依赖版本属性的局部,可以看的出来,定义了若干个技术的依赖版本号
第二组是各式各样的依赖坐标信息,可以看出依赖坐标定义中没有具体的依赖版本号,而是引用了第一组信息中定义的依赖版本属性值.
关注:上面的依赖坐标定义是出现在
<dependencyManagement>
标签中的,是对引用坐标的依赖管理,并不是实际使用的坐标。因此当你的项目中继承了这组parent信息后,在不使用对应坐标的情况下,前面的这组定义是不会具体导入某个依赖的。
关注:因为在maven中继承机会只有一次,上述继承的格式还可以切换成导入的形式进行,并且在阿里云的starter创建工程时就使用了此种形式。
3.2 SpringBoot的Starter
SpringBoot关注到实际开发时,开发者对于依赖坐标的使用往往都有一些固定的组合方式,比如使用spring-webmvc就一定要使用spring-web。每次都要固定搭配着写,非常繁琐,而且格式固定,没有任何技术含量。
SpringBoot一看这种情况,看来需要给开发者带来一些帮助了。安排,把所有的技术使用的固定搭配格式都给开发出来,以后你用某个技术,就不用每次写一堆依赖了,还容易写错,我给你做一个东西,代表一堆东西,开发者使用的时候,直接用我做好的这个东西就好了,对于这样的固定技术搭配,SpringBoot给它起了个名字叫做starter。
starter定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案,使用starter可以帮助开发者减少依赖配置。
- 项目中的pom.xml定义了使用SpringMVC技术,但是并没有写SpringMVC的坐标,而是添加了一个名字中包含starter的依赖
- 在spring-boot-starter-web中又定义了若干个具体依赖的坐标
之前提到过开发SpringMVC程序需要导入spring-webmvc的坐标和spring整合web开发的坐标,就是上面这组坐标中的最后两个了。
但是我们发现除了这两个坐标,还有其他的坐标。比如第二个,叫做spring-boot-starter-json。看名称就知道,这个是与json有关的坐标了,但是看名字发现和最后两个又不太一样,它的名字中也有starter,打开看看里面有什么?
我们可以发现,这个starter中又包含了若干个坐标,其实就是使用SpringMVC开发通常都会使用到Json,使用json又离不开这里面定义的这些坐标,看来还真是方便,SpringBoot把我们开发中使用的东西能用到的都给提前做好了。你仔细看完会发现,里面有一些你没用过的。的确会出现这种过量导入的可能性,没关系,可以通过maven中的排除依赖剔除掉一部分。不过你不管它也没事,大不了就是过量导入呗。
到这里基本上得到了一个信息,使用starter可以帮开发者快速配置依赖关系。以前写依赖3个坐标的,现在写导入一个就搞定了,就是加速依赖配置的。
starter与parent的区别
朦朦胧胧中感觉starter与parent好像都是帮助我们简化配置的,但是功能又不一样,梳理一下。
starter是一个坐标中定了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的。
parent是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由SpringBoot统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的。
2.3 引导类
配置说完了,我们发现SpringBoot确实帮助我们减少了很多配置工作,下面说一下程序是如何运行的。目前程序运行的入口就是SpringBoot工程创建时自带的那个类,也就是带有main方法的那个类,运行这个类就可以启动SpringBoot工程的运行。
SpringApplication 则是用于从main方法启动Spring应用的类。默认,它会执行以下步骤:
- 推断应用的类型是普通的项目还是Web项目
- 查找并加载所有可用初始化器,设置到initializers属性中
- 找出所有的应用程序监听器,设置到listener属性中
- 推断并设置main方法的定义类,找到运行的主类
注意:直接使用SpringApplication 的静态方法run()即可。但也可以创建实例,并自行配置需要的设置。
大家在观察这个启动类的时候,你会发现,这个类上面有了一个新的注解:@SpringBootApplication,这个注解是SpringBoot2的注解,在Springboot1,它的启动类使用的注解时@EnableAutoConfiguration和@ComponentScan注解.它与@EnableAutoConfiguration和@ComponentScan又有什么关系呢?
@SpringBootApplication: 是spring boot最重要的一个注解,用于快捷配置启动类。
我们可以通过@ SpringBootApplication的源码,认识这个注解:
2.3.1 @SpringBootConfiguration
观察到 @SpringBootConfiguration 也是来源于 @Configuration,二者功能都是将当前类标注为配置类,并将当前类里以 @Bean 注解标记的方法的实例注入到srping容器中,实例名即为方法名。至于@Configuration,我想在非SpringBoot时代大家应该不陌生吧,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置类所使用。
2.3.2 @EnableAutoConfiguration
@EnableAutoConfiguration 注解启用自动配置,其可以帮助 SpringBoot 应用将所有符合条件的 @Configuration 配置都加载到当前 IoC 容器之中,可以简要用图形示意如下:
接下来我们对照源码,来解释一下这个流程:
@EnableAutoConfiguration 借助 AutoConfigurationImportSelector 的帮助,而后者通过实现 selectImports() 方法来导出 Configuration
点击AutoConfigurationImportSelector便可以发现方法getAutoConfigurationEntry(),这个方法就是实现SpringBoot的自动配置的
- getAutoConfigurationEntry 方法:这是主要的方法,它的目的是基于给定的 AnnotationMetadata 对象来决定哪些自动配置类应该被注册到 Spring 应用上下文中。
- isEnabled:首先检查自动配置是否被启用。如果未启用,则返回一个空的AutoConfigurationEntry。
- getAttributes:获取与给定的元数据相关的注解属性。
- getCandidateConfigurations:根据元数据和注解属性获取候选的自动配置类列表。
- removeDuplicates:移除重复的配置类名称。
- getExclusions:获取不应该被导入的自动配置类。
- checkExcludedClasses:检查是否有排除的类在候选配置类中,并抛出异常如果有必要的话。
- removeAll:从候选配置类列表中移除所有排除的配置类。
- getConfigurationClassFilter:获取一个过滤器对象,该对象可以进一步筛选配置类列表。
- fireAutoConfigurationImportEvents:触发事件通知 Spring 容器有关自动配置类的信息。
- 最后,创建并返回一个 AutoConfigurationEntry 对象,该对象包含了最终确定的配置类列表和排除类集合。
总结 上述这一过程那就是:从 ClassPath下扫描所有的 META-INF/spring.factories 配置文件,并将spring.factories 文件中的 EnableAutoConfiguration 对应的配置项通过反射机制实例化为对应标注了 @Configuration 的形式的IoC容器配置类,然后注入IoC容器。
2.3.3 @ComponentScan
@ComponentScan 对应于XML配置形式中的 context:component-scan,用于将一些标注了特定注解的bean定义批量采集注册到Spring的IoC容器之中,这些特定的注解大致包括:
- @Controller
- @Component
- @Service
- @Repository
等等,对于该注解,还可以通过 basePackages 属性来更细粒度的控制该注解的自动扫描范围,比如:
@ComponentScan(basePackages ={"cn.suke.controller","cn.suke.service"})
3.面试题
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
答:启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了
以下 3 个注解:
1.@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
2.@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数
据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class
})。
3.@ComponentScan:Spring组件扫描。
如何理解 Spring Boot 中的 Starters?
答:
Starters是什么:
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
Starters命名:
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。
Starters分类:
- Spring Boot应用类启动器
- spring-boot-starter—>功能:包含自动配置,日志,YAML的支持
- spring-boot-starter-web—>功能:使用Spring MVC创建web工程,包含restful,默认使用TomCat容器
- ······
- Spring Boot生产启动器
- spring-boot-starter-actuator—>功能:提供生产环境特性,能监控管理应用
- Spring Boot技术类启动器
- spring-boot-starter-json—>功能:提供对JSON的读写支持
- spring-boot-starter-logging—>功能:默认的日志启动器,默认使用Logback
- 其他第三方启动器
版权归原作者 ✘155 所有, 如有侵权,请联系我们删除。