最近开始学习SpringBoot了,同步的看一下SpringBoot的一些基础代码是如何实现的,逐渐深挖每一个细节,能让我们的学习能力大步提高,在这里做一下学习记录。

一、SpringBoot的特点

1、项目的依赖管理

在当我刚开始学习SpringBoot的时候我就被这简单方便的依赖管理震惊了,经历过SpringMVC的痛苦配置地狱,再看SpringBoot的配置简直不要太轻松,它帮助我们完成了很多的版本仲裁和配置,能让我们在开发中减轻很多的任务量。

首先就是可以进行导入父项目作为依赖管理,我们在pom文件里做如下设置:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
</parent>

几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制,十分的方便。

然后我们如果要开发相对应的服务比如web,我们就需要导入相对应的starter启动器,只是要SpringBoot所支持的场景,在我们导入starter之后,就会把该场景的所有依赖统一导入到我们的项目中

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

由于我们上面已经配置了父工程依赖,所以我们这里不需要配置版本号了。

当然有些时候我们可能不想要系统配置的版本,我们本地有自己已经搭建好的版本,这时我们可以在pom文件中配置自定义的版本号即可:

<properties>
    <mysql.version>5.1.43</mysql.version>
</properties>

2、自动配置

在之前学习Web开发的过程中,Tomcat的配置一直都是一个学习的基础,但是在这里,SpringBoot帮助我们配置好了Tomcat的相关属性,我们只需要引入Tomcat的依赖starter即可:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.7.2</version>
      <scope>compile</scope>
</dependency>

当然我们并不需要单独写这段配置,因为这个配置太过细致,SpringBoot帮助我们建立了一个完整的Web启动器,我们在上面已经引入了,就是spring-boot-starter-web启动器,我们配置了这个依赖后,SpringBoot就会帮助我们对SpringMVC的环境配置,可以配置好它的全套常用组件,也包括Web的我们以前经常要配置的中文问题:

@Bean
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));
        return filter;
    }

它在spring-boot-autoconfigure的Jar包下的web目录中有一个HttpEncodingAutoConfiguration类,这个类中如上述代码所示,对字符的过滤进行了一个自动配置。具体自动配置如何实现,我会在后续的文章中展开描述,这里就浅挖一个小坑。

当然不仅解决了字符编码问题,还有默认包扫描,SpringBoot在底层默认配置了包扫描的路径,就是在项目启动类的当前包内的所有类都会默认扫描进去,不需要用户自己再配置,但是如果用户的启动类在一个包内,如果还有其他类在这个启动类的包外应该怎么解决这个问题,当然SpringBoot提供了一个解决方案,用户可以用指定的注解:

@SpringBootApplication(scanBasePackages="com.zxy.hehe")
或者
@ComponentScan(指定路径)

学到这里,我发现SpringBoot帮我们导入了这么多已经生成好的组件配置,那他们的值都是什么样子的呢,于是我随便打开了一个类,就比如我前面看到的HttpEncodingAutoConfiguration类,这个类的开头部分如下:

@AutoConfiguration
@EnableConfigurationProperties(ServerProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

	private final Encoding properties;

	public HttpEncodingAutoConfiguration(ServerProperties properties) {
		this.properties = properties.getServlet().getEncoding();
	}
}

这里我们看到上面有很多的注解,注解是什么意思我下面小节会详细解释,这里简要说一下就是一堆判断条件,它们判断了这个组件在自动注入的过程中,出现了哪些情况,我才会继续注入,否则这个组件不会自己注入,并且它默认生成了一个过滤器,它帮助我们如果没有配置过滤器的话就用这个默认的过滤器作为我们的项目组件添加到容器中给Spring管理。