JAVA面试题-springboot面试题
springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程。在以往我们通过SpringMVC+Spring+Mybatis框架进行开发的时候,我们需要配置web.xml,spring配置,mybatis配置,然后整合在一起,而springboot抛弃了繁琐的xml配置过程,采用大量默认的配置来简化我们的spring开发过程。
SpringBoot化繁为简,使开发变得更加的简单迅速。
用yml配置文件进行配置,通过文件
是
来确定是用生产环境,测试环境还是本地环境,dev,prod,test就是分别代表本地,正式以及测试环境
在SpringBoot主启类上面添加的SpringBootApplication是一个复合(派生)注解,里面有
很多很重要的注解,像@SpringBootConfiguration,他的作用是将SpringBoot主启动类标记为一个配置类,
Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:
自动配置始于Spring Boot的核心注解:@SpringBootApplication ,它在主函数所在的类中,是个复合注解:
这里面
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 是比较重要的注解,但 @EnableAutoConfiguration 是和自动配置关系最紧密的注解。
@EnableAutoConfiguration 也是一个复合注解:
@EnableAutoConfiguration 的关键功能由@Import提供,原因是它导入了一个很重要的类:AutoConfigurationImportSelector,这个类提供了一个重要的方法 selectImports():
selectImports()中 getCandidateConfigurations()是个重要的方法,它通过SpringFactoriesLoader.loadFactoryNames()
扫描所有META-INF/spring.factories具有的jar包:
spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件:
这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些xxxxAutoConfiguration就是自动配置类,比如这个文件中可以找到RedisAutoConfiguration、RabbitAutoConfiguration等自动配置类。
Spring Boot启动类(main方法所在类)在启动的时候,就会执行run(...)方法,run()方法的内部就会执行selectImports()方法把所有的自动配置类加载到Spring容器。
疑问:
可以看到springboot自动配置的类有很多 , 那么每次启动会不会很慢?
答案是不会的, 虽然springboot配置了这么多的类 , 但是这些类不是一定都加载的.
以常见的redis为例 RedisAutoConfiguration
进入该类可以看到 该类使用了 @ConditionalOnClass({RedisOperations.class}) 的注解 , 也就是说 只有在满足一定条件的情况下spring的ioc容器才会示例化并加载该类.