面试专题之——Spring Boot

问:为什么Spring Boot项目打包成Jar包也能运行?

答:因为在pom文件中引入了spring-boot-starter-web依赖,而这个包包含了tomcat依赖,最后由Spring Boot对其自动化配置,所以Spring Boot项目打包成Jar包也能运行。

问:Spring Boot中@Import有几种用法?

答:

4种,分别为:直接导入Bean到IOC容器、通过config类导入多个Bean到IOC容器、

导入ImportSelector实现类:用文本导入该文本所表示全限定类名的Bean,key为全限定类名

导入ImportBeanDefinitioonReigstrar实现类:与上面不同的是可以指定key

问:Spring Boot种常见自动化配置注解有哪些?

答:

@Configuration:配置注解,用于替代原先Spring的配置文件

@Bean:创建一个Bean导入到IOC容器中,key默认为方法名称

@Import:加载一个类,通常为自动化配置类

@EnableConifgurationProperties:将配置文件中的属性根据配置对象生成Bean对象

@ConifgurationProperties:打在配置对象类上,表示该对象是一个配置文件对象,并且可以指定配置前缀

@Conditional系列衍生注解:用于条件装配

问:Spring Boot是如何获取到所有自动化配置类并且实例化的?

答:

获取自动化配置类:

Spring Boot是在main方法上打上@SpringBootApplication注解作为项目入口,该注解中存在一个叫@EnableAutoConfiguration的注解,该注解中又使用了@Import注解加载AutoConfigurationImportSelector类,该类实现了DeferredImportSelector接口,该接口又实现了ImportSelector接口,该接口中有一个方法selectImports,最后在AutoConfigurationImportSelector类中实现了该方法。

在selectImports方法中调用了getAutoConfigurationEntry方法去获取spring-boot-autoconfigure包中META-INF/spring.factories文件中EnableAutoConfiguration所配置的所有自动化配置类全限定类名并返回数组

实例化:

获取到所有自动化配置类后,每个自动化配置类按照@Conditional系列衍生注解的条件进行生效,默认都会绑定配置文件并指定默认值。

问:Spring Boot自动化配置的类是否会全部生效?为什么?

答:不会

因为每个自动化配置类基本都会使用@Conditional系列衍生注解来根据条来判断是否生效

问:如果自动化配置的类生效了,默认配置是什么?怎么获取的?

答:默认值由打上@ConifgurationProperties注解的配置类决定,如果需要修改配置只需要在yml配置文件中配置该注解约定的配置项即可