SpringBoot面试题
@EnableAutoConfiguration 注解和 spring.factories 指定配置类
SpirngBoot面试题
什么是SpringBoot?
版本一
SpringBoot是一个用于简化Spring服务项目开发的框架,极大简化了Spring框架的配置项,降低的服务开发门槛,基本实现了开箱即用。
并且SpringBoot已经事先集成了好了大量的数据库、消息队列等中间件,在使用时只需要引入依赖和在properties配置文件中进行极少的配置,即可实现开箱即用。
这些中间件都会有大量的默认配置值,减少了显示配置,体现SpringBoot简单易用的同时,也体现出其约定大于配置的设计理念。
SpringBoot内置了Tomcat容器,实现构建的jar包通过java -jar命令即可直接运行,无需额外安装Tomcat和配置。
SpringBoot的核心注解是@SpringBootApplication。
@SpringBootApplication注解又是由@EnableAutoConfiguration注解、@ComponentScan注解、@Configuration注解。
@Configuration注解用于标识@SpringBootApplication标识的启动类是Spring的一个配置类。
@EnableAutoConfiguration是自动配置启动注解,会根据配置类指定路径里的对象依赖关系,自动加载组件,SpringBoot集成的中间件,实现引入依赖就可直接使用,就是依靠的自动配置。
@ComponentScan注解是扫描指定路径包下面带有@Component、@Controller、@Service,然后根据条件配置注解@ConditionOnXXX,判断将所需的Bean对象归类到IOC容器里统一管理。
版本二
Spring Boot 的核心定位是 “简化 Spring 应用的初始搭建和开发”。
它主要通过三大特性来实现这个目标:
- 自动配置:项目引入哪个组件的 Starter 依赖,Spring Boot 就会根据类路径自动配置好这个组件,基本不用手动写配置,实现了 “开箱即用”。
- 内嵌服务器:它直接把 Tomcat 等服务器打包到应用中,最终项目是一个jar包,用
java -jar命令就能直接运行,无需额外部署。 - 核心注解:这一切的起点是
@SpringBootApplication注解,它整合了:@ComponentScan(扫描本包组件)@EnableAutoConfiguration(开启自动配置的核心)
总结,Spring Boot 通过 “约定大于配置” 的理念,用自动配置和内嵌容器,极大地降低了开发门槛。
Springboot的自动配置原理
Spring Boot 自动配置的核心是 @EnableAutoConfiguration 注解,是 @SpringBootApplication 的三个核心注解之一。
@EnableAutoConfiguration 是开启自动配置的核心,@EnableAutoConfiguration 的核心又是 @Import 注解导入的 AutoConfigurationImportSelector 自动配置导入选择器,他会自动去META-INF目录下的 spring.factories 文件(后被新机制 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports替代)找到指定的配置类。
然后根据自定义配置类里的 @ConditionalOnClass 、@ConditionalOnProperty 、@ConditionalOnMissingBean 条件注解进行bean扫描和创建。
SpringBoot是怎么通过main方法启动web项目的
表层是通过SpringBootApplication.run方法。
深层是因为@SpringBootApplication注解里的自动配置注解EnableAutoConfiguration,所以会根据项目依赖的spring-boot-starter-web依赖,自动创建并配置内置的web服务器。
运行run方法时会启动一个Spring容器,会创建一个应用上下文ApplicationContext,因为是扫描到有starter-web依赖,是web服务,所以创建的是AnnotationConfigServletWebServerApplicationContext ,通过ApplicationContextFactory工厂创建的上下文。
在创建了 AnnotationConfigServletWebServerApplicationContext 上下文之后,会去执行这个上下文的父类 ServletWebServerApplicationContext 的 refresh 方法,再调用到 onRefresh 方法。
最终会调用到 createWebServer() ,在这个方法里会通过 ServletWebServerFactory 工厂创建一个 TomcatWebServer ,就完成了内嵌web服务器的创建与启动 。
