SPRINGBOOT面试题

               JAVA面试题-springboot面试题

  1. 简单介绍一下springboot

   

    springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程。在以往我们通过SpringMVC+Spring+Mybatis框架进行开发的时候,我们需要配置web.xml,spring配置,mybatis配置,然后整合在一起,而springboot抛弃了繁琐的xml配置过程,采用大量默认的配置来简化我们的spring开发过程。

SpringBoot化繁为简,使开发变得更加的简单迅速。

  • Springboot简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)

SPRINGBOOT面试题_第1张图片

 

用yml配置文件进行配置,通过文件

SPRINGBOOT面试题_第2张图片

 

来确定是用生产环境,测试环境还是本地环境,dev,prod,test就是分别代表本地,正式以及测试环境

  • 创建独立的spring引用程序 main方法运行 

SPRINGBOOT面试题_第3张图片

 

  • 嵌入的Tomcat 无需部署war文件 
  • 简化maven配置 
  • 自动配置spring添加对应功能starter自动化配置 
  1. springboot自动配置原理

在SpringBoot主启类上面添加的SpringBootApplication是一个复合(派生)注解,里面有
很多很重要的注解,像@SpringBootConfiguration,他的作用是将SpringBoot主启动类标记为一个配置类,

Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:

SPRINGBOOT面试题_第4张图片

自动配置始于Spring Boot的核心注解:@SpringBootApplication  ,它在主函数所在的类中,是个复合注解:

 SPRINGBOOT面试题_第5张图片

 

这里面

@SpringBootConfiguration   @EnableAutoConfiguration   @ComponentScan 是比较重要的注解,但 @EnableAutoConfiguration  是和自动配置关系最紧密的注解。

SPRINGBOOT面试题_第6张图片

 

@EnableAutoConfiguration 也是一个复合注解:

@EnableAutoConfiguration 的关键功能由@Import提供,原因是它导入了一个很重要的类:AutoConfigurationImportSelector,这个类提供了一个重要的方法 selectImports():

SPRINGBOOT面试题_第7张图片

 

selectImports()中 getCandidateConfigurations()是个重要的方法,它通过SpringFactoriesLoader.loadFactoryNames()

扫描所有META-INF/spring.factories具有的jar包:

SPRINGBOOT面试题_第8张图片

SPRINGBOOT面试题_第9张图片 

spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件:

SPRINGBOOT面试题_第10张图片

这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些xxxxAutoConfiguration就是自动配置类,比如这个文件中可以找到RedisAutoConfiguration、RabbitAutoConfiguration等自动配置类。

Spring Boot启动类(main方法所在类)在启动的时候,就会执行run(...)方法,run()方法的内部就会执行selectImports()方法把所有的自动配置类加载到Spring容器。

疑问:

可以看到springboot自动配置的类有很多 , 那么每次启动会不会很慢?

答案是不会的, 虽然springboot配置了这么多的类 , 但是这些类不是一定都加载的.

以常见的redis为例 RedisAutoConfiguration

SPRINGBOOT面试题_第11张图片

 

进入该类可以看到 该类使用了 @ConditionalOnClass({RedisOperations.class}) 的注解 , 也就是说 只有在满足一定条件的情况下spring的ioc容器才会示例化并加载该类.

你可能感兴趣的:(spring,boot,java)