一、什么是 Spring Boot?
参考回答:
SpringBoot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
二、 Spring Boot的优点?
参考回答:
Spring Boot 优点非常多,如:
(1)独立运行
Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
(2)简化配置
spring-boot-starter-web启动器自动依赖其他组件,减少了maven的配置。
(3)自动配置
Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
(4)无代码生成和XML配置
Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
(5)应用监控
Spring Boot提供一系列端点可以监控服务及应用,做健康检测。
三、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
参考回答:
Spring Boot 中有以下两种配置文件:
(1)bootstrap (yml 或者properties)
(2)application (yml 或者properties)
bootstrap/ application 的区别:
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap,另外一种是 application,bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
因此,对比 application 配置文件,bootstrap 配置文件具有以下几个特性:
(1)boostrap 由类 ApplicationContext 加载,比 applicaton 优先加载
(2)boostrap 里面的属性不能被覆盖
bootstrap/ application 的应用场景:
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景:
(1)使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
(2)一些固定的不能被覆盖的属性
(3)一些加密/解密的场景。
四、Spring Boot 的配置文件有哪几种格式?它们有什么区别?
参考回答:
properties和yml,它们的区别主要是书写格式不同。
(1)properties
app.user.name = java
(2)yml
app: user: name: javastack
另外,yml格式不支持 @PropertySource 注解导入配置。
五、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
参考回答:
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
(1)@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
(2)@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:
1@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
(3)@ComponentScan:Spring组件扫描。
六、开启 Spring Boot 特性有哪几种方式?
参考回答:
有以下两种方式:(1)继承spring-boot-starter-parent项目
1<parent> 2<groupId>org.springframework.boot</groupId> 3<artifactId>spring-boot-starter-parent</artifactId> 4<version>1.5.6.RELEASE</version> 5</parent>
(2) 导入spring-boot-dependencies项目依赖
1<dependencyManagement> 2 <dependencies> 3 <dependency> 4 <groupId>org.springframework.boot</groupId> 5 <artifactId>spring-boot-dependencies</artifactId> 6 <version>1.5.6.RELEASE</version> 7 <type>pom</type> 8 <scope>import</scope> 9 </dependency> 10 <dependencies> 11</dependencyManagement>
Spring Boot依赖需要注意以下几点:
1) 属性覆盖只对继承有效
Spring Boot依赖包里面的组件的版本都是和当前Spring Boot绑定的,如果要修改里面组件的版本,只需要添加如下属性覆盖即可,但这种方式只对继承有效,导入的方式无效。
1<properties> 2 <slf4j.version>1.7.25<slf4j.version> 3</properties>
2) 如果导入的方式要实现版本的升级,达到上面的效果,这样也可以做到,把要升级的组件依赖放到Spring Boot之前。
注意:要修改Spring Boot的依赖组件版本可能会造成不兼容的问题。
七、Spring Boot 需要独立的容器运行吗?
参考回答:
可以不需要,内置了 Tomcat/Jetty 等容器。
八、运行 Spring Boot 有哪几种方式?
参考回答:
(1)打包用命令或者放到容器中运行。
(2)用 Maven/Gradle 插件运行。
(3)直接执行 main 方法运行。
九、Spring Boot 自动配置原理是什么?
参考回答:
Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射。
1org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Class<?>, ClassLoader) 1public static List<String> loadFactoryNames(Class<?> factoryClass,ClassLoader classLoader){ 2 3 String factoryClassName = factoryClass.getName(); 4 try{ 5 Enumeration<URL> urls = (classLoader!=null?classLoader.getResources(FACTORIES_RESOURCE_LOCATION):lassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)); 6 7 List<String> result = new ArrayList<String>(); 8 9 while(urls.hasMoreElements()){ 10 URL url = urls.nextElement(); 11 Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url)); 12 String factoryClassNames = properties.getProperty(factoryClassName); 13 result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames))); 14 15 } 16 return result; 17 }catch(IOException ex){ 18 19 throw new IllegalArgumentException("Unable to load ["+factoryClass.getName()+"] factories from location ["+FACTORIES_RESOURCE_LOCATION+"]",ex); 20 21 } 22 23}
这个方法会加载类路径及所有jar包下META-INF/spring.factories配置中映射的自动配置的类。
1/** 2 * The location to look for factories. 3 * <p>Can be present in multiple JAR files. 4 */ 5 6public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
查看Spring Boot自带的自动配置的包:spring-boot-autoconfigure-1.5.6.RELEASE.jar,打开其中的META-INF/spring.factories文件会找到自动配置的映射。
再来看看数据源自动配置的实现注解
@Configuration,@ConditionalOnClass就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
十、如何在 Spring Boot 启动的时候运行一些特定的代码?
参考回答:
如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口ApplicationRunner或者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。
(1)CommandLineRunner:启动获取命令行参数
(2)ApplicationRunner:启动获取应用启动的时候参数
使用方式:
或者这样:
启动顺序:
如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序,可以实现 org.springframework.core.Ordered接口或者使用 org.springframework.core.annotation.Order注解。