-
什么是 Spring Boot
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
-
依赖简化
只需要引入spring-boot-starter-web
spring mvc , json,tomcat 自动引入
不用担心 版本不一致的问题 -
配置简化
不用各种xml
一堆的配置 properties 文件 简化配置 yml更简单
不用配置扫包
直接指定@controller @component @ service就行了 -
监控简化
我们可以引入spring-boot-start-actuator
依赖,直接使用 REST 方式来获取进程的运行期性能参数,从而达到监控的目的,比较方便
- Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
核心注解: @SpringBootApplication
又分为3个注解:
-
@SpringBootConfiguration
:@SpringBootConfiguration
继承自@Configuration
,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean
注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
@Bean
public Map createMap(){
context.getBean("createMap"); //获取bean 实例名就是方法名
-
@ComponentScan
:扫描启动类所在包下的所有类。
这个注解加上@configuration
可以扫描指定位置包,并把有@service @controller
类似注解的当做bean到并注册到spring 容器。 -
@EnableAutoConfiguration
:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置。
参考:https://mp.weixin.qq.com/s/gs2zLSH6m9ijO0-pP2sr9Q
https://www.cnblogs.com/javaguide/p/springboot-auto-config.html
-
如何实现自动加载配置
@EnableAutoConfiguration
这个注解,起到了关键作用。
在启动的时候会把导入包的META-INF/spring.factories
路径下列出的配置类(XXXAutoConfiguration
)自动装配到内存,过程中会类中的条件进行选择是否注入。其中的条件大致分为class,bean,配置3种,根据这3种是否存在选择是否注入。
-
META-INF/spring.factories
中文件以接口和实现类为关系列出,接口为key(EnableAutoConfiguration
不是),实现类为value;常见的接口有:-
ApplicationContextInitializer
启动初始化。会在springboot
初始化时创建,在调用run
方法时,创建Application
后执行。 -
ApplicationListener
启动监听器。会在springboot
初始化时创建。在调用run方法时,各个步骤调用回调。 -
EnableAutoConfiguration
配置类实现自动配置功能。在run
的refresh
方法中调用(ApplicationContext的refresh的postproess步骤中创建); - 各种
PostProcessor
-
-
META-INF
是在生成jar包时放jar描述信息的文件夹。- 常见有
mainfest.mf
文件其中包含main
类位置,以及其他加载jar包的配置。 - 还有
pom.xml
,maven的配置。
- 常见有
-
启动流程
spring boot启动 大致分为2步 ->SpingApplication初始化和run方法
-
SpingApplication
的初始化
(1) 指定配置类 一般是main所在类 会根据类的注解去当做配置。确定web类型 是否是嵌入式servlet容器。
(2)SpringFactoriesLoader
的机制 扫描jar包下/META-INF/spring.factories
文件 把文件里指定的ApplicationContextInitializer
和ApplicationListener
通过反射创建对象,存起来。
(3) 指定主类-main所在类(通过调用栈获取)。感觉是为了打日志用的,日志要求指定类打印的。 -
SpringApplication run
方法调用
(1) SpringFactoriesLoader的机制 加载创建xxListener
执行starting
(2) 准备Environment ,创建配置环境,启动参数等。runListener->environment准备好了
(3) 通过environment创建ApplicationContext。 调用初始化时xxInitializer
的初始化方法 ,加载配置环境,启动参数等。runListener->ApplicationContext准备好了
(4) application.refresh方法。主要是bean单例的加载,以及容器的创建。runListener->ApplicationContext启动完了
-
bean
信息存储到beanDefinetion
的map中,设置beanfactory
的类加载器和一些属性。 - 执行
beanFactory
的postProcessor
方法, - 注册bean的
postProcessor
(实例化springboot
中factories
文件中的指定的配置类) - 注册
listener
-
实例化业务中的
bean
(单例业务中@component,@controller,@Service
注解的类) - 通知
listener,applicationContext
初始化完成
(5) 检查是否有ApplicationRunner和CommandLineRunner,有的话就遍历执行
图1.pngrunListener->springboot启动完了
-
参考:https://mp.weixin.qq.com/s/EzSM_VK8bH2QhWX9nGQONQ
https://www.jianshu.com/p/603d125f21b3
https://www.processon.com/view/link/59812124e4b0de2518b32b6e
https://blog.nowcoder.net/n/5900dcf9c0bf463d8f6c848859f054a4?from=nowcoder_improve
https://segmentfault.com/a/1190000019560001
https://blog.csdn.net/xuan_lu/article/details/108249324?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen
-
Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件优先级比较高,加载比较早。
具体请看这篇文章《Spring Boot 核心配置文件详解》。 -
Spring Boot 的配置文件有哪几种格式?它们有什么区别?
application.properties中内容如下:
server.port=8080
server.servlet.context-path=elk
application.yml中内容如下:
server:
port: 8080
servlet:
context-path: /elk
.yml格式的配置文件需要注意几点:
1)冒号后面要加空格;
2)缩进不能使用TAB;
- Spring Boot 有哪几种读取配置的方式?
@Value("${info.address}")
private String address;
@ConfigurationProperties(prefix ="info")
public class InfoConfig2{
@Autowired
private Environment env;
// 获取参数
String getProperty(String key){
return env.getProperty(key);
}
网友评论