面试专题之——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配置文件中配置该注解约定的配置项即可