一、Springboot零配置的实现
主要思想是通过注解来代替之前的XML
在创建传统SpringMVC项目时,需要复杂的配置文件,例如:
1、web.xml,(1)配置servlet给容器,也就是我们的tomcat(2)初始化springcontext
2、application.xml,扫描mybatis.xml,扫描mapper,数据源,扫描包
3、springmvc.xml,扫描controller,视图解析器等
总结一下启动服务做了哪些事情:
- 启动了一个Tomcat服务
- 初始化Spring上下文环境
- 注册DispatcherServlet
Spring Boot要想达到零配置,这些问题必须要解决。
解决方案
- 内嵌Tomcat代替原生去除web.xml: WebInit extends AbstractAnnotationConfigDispatcherServletInitializer
- 用JavaConfig,@Configuration,@Bean来代替applicationContext.xml,声明将Bean交给容器管理。@Configuration> public class SpringConfig
- 代替spring-mvc.xml。各种注解+DispatchServlet的自动装配。WebConfig implements WebMvcConfigurer
二、Spring内嵌Tomcat底层原理
在刷新容器上下文的时候,会加载tomcat
三、Springboot自定义starter及自动装配底层原理
- Spring Boot 中,我们直接引入一个 starter 即可。引入 starter 之后,我们通过少量注解和一些简单的配置就能满足第三方的依赖
2. @SpringBootApplication
- @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
- @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
- @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描[启动类]所在的包下所有的类
- @EnableAutoConfiguration:实现自动装配的核心注解
- @Import({AutoConfigurationImportSelector.class})
将AutoConfigurationImportSelector这个类导入到spring容器中,AutoConfigurationImportSelector可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器
- @Import 注解
普通类,直接导入到IOC容器管理
ImportBeanDefinitionRegistrar接口实现类,支持手动注册bean
ImportSelector实现,ImportSelector接口只定义了一个selectImports()会把实现类中返回的Class名称都定义为bean.
- AutoConfigurationImportSelector中的selectImport是自动装配的核心实现,它主要是读取META-INF/spring.factories文件,经过去重、过滤,返回需要装配的取需要配置的bean全限定名列表。
4.总结
(1)@SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})实现自动装配。
(2)AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类。
(3)通过Spring提供的SpringFactoriesLoader机制(SPI),扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类。
(4)依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配。
四、Springboot启动流程源码(spring 的监听机制 )
- SpringApplication 构造方法
获得应用类型
利用spi机制加载applicationContextInitializer【初始化器】, applicationLister【监听器】接口实例(META-INF/[spring.factories]
定位main方法
- 调run方法
获取并启动监听器
准备环境
刷新容器(上下文)前 (内置tomcat)
刷新容器
刷新容器后
发布容器启动完成事件
五、SpringBoot配置文件的优先级
1、配置文件加载顺序小结
简单:命令行,系统环境变量,properties,yaml,yml
外部配置加载顺序SpringBoot也可以从以下位置加载配置:
优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 。
- 命令行参数。所有的配置都可以在命令行上进行指定;
- 来自java:comp/env的JNDI属性;
- Java系统属性(System.getProperties());
- 操作系统环境变量 ;
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
2、bootstrap.xml 和application.yml
六、Springboot的关键标签*