SpringBoot源码深度解析(⼀):SpringBoot的⾃动配置原理
前⾔
SpringBoot流⾏之前,程序员⼤多是⽤SSM框架整合来进⾏WEB后端开发。这种⽅式⾮常⿇烦,需要⼿动引⼊⼤量的包,还要配置很多XML⽂件,光是搭建环境就需要很久。
随着“约定⼤于配置”理念的流⾏,SpringBoot随之兴起,它⼤⼤简化了web开发的流程,可以让初学者快速上⼿。SpringBoot的核⼼理念⼤致有3点:
1、帮助开发者快速整合第3⽅框架,原理是maven依赖封装和⾃定义的Starter。
2、完全去除XML,采⽤纯注解的⽅式。原理是SpringBoot其实是根据Spring的体系原⽣的注解实现的包装。
3、不需要外部容器,转⽽使⽤内嵌的web容器,原理是使⽤Java语⾔创建tomcat服务器,然后将本地的class⽂件交给tomcat来加载。Tomcat tomcat = new Tomcat()。javascript高级程序设计
正⽂
常见的springboot程序如下所⽰:
package org.study.jimmy.springmvctest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
北京嵌入式计算机有限公司public class SpringMvcTestApplication {
public static void main(String[] args){
SpringApplication.run(SpringMvcTestApplication.class, args);
}
}
关键点有2个,⼀个是类上的注解@SpringBootApplication,另⼀个是run()⽅法。
⾸先来看⼀下注解@SpringBootApplication,它是个复合注解,使⽤的都是spring的原⽣注解,
this is us观后感
我们来看看@EnableAutoConfiguration这个注解,这个注解会引⼊⼀个AutoConfigurationImportSelector类。
这个类的作⽤是去spring-boot-autoconfig包下的路径⾥读取EnableAutoConfiguration类的⼦类,实例化后放⼊IOC容器中,这个过程即加载了常见的第三⽅组件的配置类。
我们来看2个由上⾯这个⽂件引⼊的配置类,
第⼀个是ServletWebServerFactoryAutoConfiguration。这个类专门⽤来⾃动化配置web容器。这个类头上有2个注解,⼀个是
@EnableConfigurationProperties(ServerProperties.class),这个注解的作⽤是将括号中的POJO类绑定到类中的⽅法⾥⾯使⽤。
这个POJO类就是包含了⼀些属性的普通类,它头上也有⼀个注解,@ConfigurationProperties(prefix = “server”, ignoreUnknownFields = true),这个注解表⽰,程序会将配置⽂件properties中以server为前缀的配置项的值绑定到这个POJO对象中。⽐如常⽤的改端⼝号的配置:server.port=80。
第⼆个是DispatcherServletAutoConfiguration,这个类是⽤来⾃动配置SpringMVC的。同样也使⽤了
@EnableConfigurationProperties(WebMvcProperties.class)注解将⽤户配置的配置项注⼊到程序中。
那么问题1来了,⽂件中有那么多配置类,为何有的⽣效了,有的没有⽣效呢?原因就在于这些配置类上都有⼀些注解
@ConditionalOnXXX,会根据⼀些条件才会去⽣效配置。
问题2:POJO绑定的格式是什么样的?答:松散绑定,即配置⽂件中全⼩写加横杠隔开对应程序中的⼩驼峰。last-name对应于lastName。
接下来我们来看run()⽅法。
angular数据双向绑定
最主要的2步就是读取配置⽂件中的配置项并绑定到POJO上,然后refresh刷新容器,将bean纳管到IOC容器中,程序启动。其中刷新容器的过程就是之前讲的spring源码中的刷新容器的过程。有兴趣的可以去我之前的博客看⼀下。培训班失火
properties是什么文件总结
为什么说SpringBoot⼤⼤简化了开发流程,就是因为它遵循了约定⼤于配置的思想,将我们常⽤的组件都配置加载放到IOC容器中。当然⽤户也可以将⾃⼰的配置写到配置⽂件中,结合上⾯讲的2个注解绑定到POJO类上去,供组件读取使⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。