个人主页:个人主页
系列专栏:Java面试专题
目录
1.spring-bean的循环依赖
2.springMVC执行流程
3.Springboot自动配置原理
4.Spring框架常见的注解(Spring,SpringMVC,SpringBoot)
①用户发送请求到前端控制器DispatcherServlet
②DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
③HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
④DispatcherServlet调用HandlerAdapter(处理器适配器)。
⑤HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。
⑥方法上添加@ResponseBody
⑦通过HttpMessageConverter来返回结果转换为JSON并响应
什么是自动装配
Spring Boot 相比于 Spring 的一个很大进步点在于不用再手动配置一系列配置文件,Spring Boot 提供了配置应用程序和框架所需要的基本配置,这就是自动配置。本节会先通过源码介绍自动装配,并在本节最后给出总结。
Spring Boot 启动器
Spring Boot 中的一系列启动器是自动装配的最佳实践。比如当引入了一个 spring-boot-starter-web 依赖:
org.springframework.boot
spring-boot-starter-web
Spring Boot 框架就会自动引入 web 环境所有的依赖,并且自动配置,Spring Boot 将所有的功能场景,都变成一个个启动器,想要用什么功能,只需要找到对应的启动器就可以了。
Spring Boot 的所有启动器可以在官网 https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter 中找到,下图是所有启动器中的一小部分:
自动装配原理分析
Spring Boot 的主程序也可以称为启动类,这是开启 Spring Boot 项目的入口。查看源代码推荐使用 IDEA。
package com.lanqiaoyun.springbootdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootdemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
@SpringBootApplication
注解标注这个类是一个 SpringBoot 的启动类,这个注解也是自动装配的核心。
@Target
、Retention
、Documented
、Inherited
四个注解是标准的元注解,核心在于@SpringBootConfiguration
和@EnableAutoConfiguration
这两个注解。
通过继续进入注解内部,可以将@SpringBootConfiguration
和@EnableAutoConfiguration
这两个注解的结构表示出来:
@SpringBootConfiguration
声明了这个类为 SpringBoot 的组件,@EnableAutoConfiguration
是自动配置的核心,其中@AutoConfigurationPackage
对配置包进行了注册,AutoConfigurationImportSelector
类来进行自动装配。
继续来看看 AutoConfigurationImportSelector
这个类。
继续向下看,selectImports 中 的getAutoConfigurationEntry
方法第 86 行代码将所有的配置通过 getCandidateConfigurations 方法放进一个 List 集合中。
继续进入 getCandidateConfigurations
方法,这个配置获取的路径是 EnableAutoConfiguration.class
,也就是@SpringBootApplication
所依赖的两个重要注解的其中一个。这段代码最终想表达的意思是将启动类下的所有配置都导入。
进入 LoadFactoryNames 或者就从 Assert.notEmpty 的信息中,可以发现这些配置来自于 META-INF/spring.factories 中,从 jar 包中可以查看到具体的目录结构。
在 spring.factories 文件中存在大量 xxxAutoConfiguration,这个文件记录了所有 starter 的自动装配类,就是这些类在容器中导入了场景需要的所有组件;并通过 @Configuration 自动配置。
通过一张图来总结一下自动装配的原理,通过上面对源码的分析,可以看出 SpringBoot 所有的自动配置都在启动类中被扫描和加载。所有的自动配置类都在 spring.properties 中。
@ConditionalOnClass 这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。
自动装配总结起来可以分为以下几步: