前言
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()。
正文
常见的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的原生注解,
我们来看看@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()方法。
最主要的2步就是读取配置文件中的配置项并绑定到POJO上,然后refresh刷新容器,将bean纳管到IOC容器中,程序启动。其中刷新容器的过程就是之前讲的spring源码中的刷新容器的过程。有兴趣的可以去我之前的博客看一下。
总结
为什么说SpringBoot大大简化了开发流程,就是因为它遵循了约定大于配置的思想,将我们常用的组件都配置加载放到IOC容器中。当然用户也可以将自己的配置写到配置文件中,结合上面讲的2个注解绑定到POJO类上去,供组件读取使用。