前言
本文主要研究SpringBoot的配置,重点是自动配置的原理。
SpringBoot的配置
SpringBoot的配置文件有两种类型:
- application.properties
server.port=8888
spring.mvc.view.prefix=/resources/templates/
spring.mvc.view.suffix=html
- application.yml
server:
port: 8888
spring:
mvc:
view:
prefix: /resources/templates/
suffix: html
yml文件的配置更加简洁一些,需要注意格式:
- 每一层属性都必须有缩进
- 冒号后面必须有空格
自动配置原理
前面的SpringMVC案例中我们完全看不到之前SpringMVC繁杂的配置,这些配置都到哪里去了呢?
下面就带大家来看看SpringBoot是如何实现自动配置的。
分析启动类
两个重点:
- @SpringBootApplication 注解
- SpringApplication.run方法
@SpringBootApplication
源码:
@SpringBootApplication三个重要的上级注解:
- @SpringBootConfiguration
表示当前类是SpringBoot的配置类,继承了@Configuration注解 - @ComponentScan
表示当前类可以对下面的包进行组件扫描,完成IOC - @EnableAutoConfiguration
表示启动自动配置,SpringBoot的自动配置特性就是该注解启动的
自动配置过程
@EnableAutoConfiguration启动了自动配置,还要考虑两个问题:
- 配置的内容在哪里呢?
- 为什么引入starter后就开始生效呢?
配置的内容
在引入的依赖中,有个叫:spring-boot-autoconfigure
打开后会看到里面有大量的第三方框架名称,几乎涵盖了所有主流的框架。
SpringMVC配置分析
来看看我们熟悉的SpringMVC的配置
配置何时生效
WebMvcAutoConfiguration源码:
重点看上面的几个注解:
- @Configuration
表示当前类是一个配置类 - @ConditionalOnClass
配置生效的条件是存在某些类,这里有Servlet、DispatcherServlet和WebMvcConfigurer,这些都是SpringMVC核心类,也就是说只要引入了SpringMVC的依赖,配置就生效。 - @ConditionalOnMissingBean
配置生效的条件是不存在某些对象,存在WebMvcConfigurationSupport对象配置就失效。 - @AutoConfigureOrder
自动配置的顺序 - @AutoConfigureAfter
自动配置在哪些配置后执行
属性在哪里
WebMvcAutoConfiguration代码中有视图解析器、前缀和后缀的配置等,该类里面还有其它SpringMVC组件的配置,这里就不一一列举了。
WebMvcAutoConfiguration进行配置的属性又在哪里呢?
内部类WebMvcAutoConfigurationAdapter
上面的注解 @EnableConfigurationProperties就是注入配置属性的意思,属性来自于WebMvcProperties、ResourceProperties、WebProperties类。
WebMvcProperties的配置前缀是spring.mvc
可以看到prefix、suffix、path这些常见的配置属性,我们在配置文件中写的spring.mvc.view.prefix等就能修改这些属性的值。
自动配置总结
SpringBoot的自动配置原理
- 启动类的@SpringBootApplication注解包含@EnableAutoConfiguration注解,启动自动配置
- 在spring-boot-autoconfigure依赖中包含了大量第三方框架的自动配置类
- 自动配置类包含了对应框架的配置的内容
- 自动配置类生效的条件是当某些类被导入项目中,也就是导入了相应的依赖
- 开发者不写配置就会应用默认的配置
- 开发者可以通过application.properties文件改写配置
结束
大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总