1、什么是 Spring Boot?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
1.用来简化spring应用的初始搭建以及开发过程使用特定的方式来进行配置(properties或yml文件)
2.创建独立的spring引用程序 main方法运行
3.嵌入的Tomcat 无需部署war文件
4.简化maven配置
5.自动配置spring添加对应功能starter自动化配置
2、为什么要用 Spring Boot?
Spring Boot 优点非常多,如:
独立运行
简化配置
自动配置
无代码生成和XML配置
应用监控
上手容易
…
3、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。bootstrap 配置文件有以下几个应用场景。
- 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性;
- 一些加密/解密的场景;
4、Spring Boot 的配置文件有哪几种格式?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同。
1).properties
app.user.name = javastack
2).yml
app:
user:
name: javastack
另外,.yml 格式不支持 @PropertySource 注解导入配置。
5、Spring Boot的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
6、开启 SpringBoot特性有哪几种方式?
1)继承spring-boot-starter-parent项目
2)导入spring-boot-dependencies项目依赖
7、SpringBoot需要独立的容器运行吗?
8、运行SpringBoot有哪几种方式?
1)打包用命令或者放到容器中运行
2)用 Maven/ Gradle 插件运行
3)直接执行 main 方法运行
9、SpringBoot自动配置原理是什么?
(1)引导类上开启@EnableAutoConfiguration
(2)内部通过@import注解引入ImporttSelector
(3)查找工程jar包中META-INF/spring.factories文件
(4)装载内部的对象到容器
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,通过@ConfigurationProperties注解把全局配置文件中的值绑定到实体类JavaBean上面,再通过@EnableConfigurationProperties注解把绑定的JavaBean 注入到Spring容器当中。
10. Spring的循环依赖的解决方案
Java中的循环依赖分两种,一种是构造器的循环依赖,另一种是属性的循环依赖。
如果是构造器依赖,ABC构造器循环依赖,在创建A的时候singletonsCurrentlyInCreation中有A的beanName,然后发现需要B对象,先获取B,发现B不存在,那么继续创建B,先在singletonsCurrentlyInCreation中存放B的beanName,然后发现创建B对象的时候,需要先创建C,继续查询C,发现C不存在,那么现在singletonsCurrentlyInCreation中存放C的beanName,但是创建C的时候发现需要先创建A,获取A的时候spring发现singletonsCurrentlyInCreation存在A的beanName,那么表示A当前正在被创建中,spring抛出异常。
这种循环依赖没有什么解决办法,因为JVM虚拟机在对类进行实例化的时候,需先实例化构造器的参数,而由于循环引用这个参数无法提前实例化,故只能抛出错误。
通过setter的循环依赖,可以避免这个错误。 因为spring的创建分为3步。
①createBeanInstance:初始化对象,类似于clazz.newInstance()
②populateBean:填充属性,bean的对象依赖属性就是在这一步进行填充
③initializeBean:调用spring配置中的init-method方法
经过上述三步,一个spring的bean才被完全创建。setter形式的循环依赖出现在第一步跟第二步之间,所以spring在存放bean的时候做了一点文章。
spring将单例bean的存放利用三个hashmap作为三个级别的缓存解决循环引用问题。