一、SpringBoot框架之快速入门

1,880 阅读7分钟

1. 框架简介

Spring Boot框架是简化Spring开发的框架,是基于Spring框架的再封装,通过自动配置,简化开发者对不同框架整合时所需的配置。Spring Boot是对Spring技术栈的大整合,是J2EE开发一站式解决方案。

优点:

  • 快速创建独立运行的的Spring项目以及和主流框架的集成;
  • 使用嵌入式Servlet容器,应用无需打包成war包;
  • 通过starter进行自动依赖和版本控制;
  • 有大量的自动配置,简化开发,也可以修改默认值;
  • 无需配置xml,不用代码生成器,开箱即用;
  • 部署简单,便于维护和升级;
  • 天然与微服务和云计算相契合;

2. 微服务简介

微服务是martin fowler在2014年发表的论文中提到微服务的概念是一种架构思想,主体思想是对以往的单体应用进行功能的拆分,不同的功能拆分成不同的服务部署在不同的服务器上,各个服务之间通过HTTP的方式进行互通。

martin fowler的论文:微服务论文

单体应用

特征:ALL IN ONE

所有的服务和功能在同一个项目中,代码间相互调用方便,部署在一台服务器上。随着业务功能的拓展项目模块会越来越庞大复杂,增加了项目开发维护的成本,升级维护时需要对整个项目进行重新部署。

微服务应用

采用分而治之的方式对项目中的不同模块进行开发,以确保每个功能元素始终是一个可以独立替换和升级的软件单元。每个服务模块仅关注特定的业务功能,业务清晰代码量少,已与开发和维护。支持系统快速升级迭代,部分功能出现异常不会对整体系统产生影响。

此处对微服务架构仅简单的介绍,这里放一篇对不同架构详细介绍的博客:相关博客

3. 环境配置

jdk1.8+:Spring Boot官方推荐jdk1.7以上

maven 3.2+:Spring官方推荐maven 3.2以上版本使用

SpringBoot 2.3.4.RELEASE:Spring最新的稳定版

IDE:IntelliJ IDEA或STS(Spring Tool Suite)

关于Spring Boot不同版本之间的关系介绍请参考:Spring Boot个版本之间的关系

不同Spring Boot版本需要的配置环境请参考Spring官方文档:Spring Boot官方文档

关于IDEA整合maven的内容此处不再介绍,推荐查看博客:IDEA中配置maven

4.创建Spring Boot应用

4.1 通过maven创建

① 创建maven工程,打包方式jar包

② 书写pom.xml文件,导入相关依赖

③ 书写主程序类,写好注解

④ 启动主项目,浏览器访问

示例代码:

① pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.bruce</groupId>
    <artifactId>springBoot-01-helloword</artifactId>
    <version>1.0-SNAPSHOT</version>

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

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

② 书写主程序类:HelloWordMainApplication

/**
 * @SpringBootApplication 用于标注一个主程序类,声明为一个Spring Boot应用
 */
@SpringBootApplication
public class HelloWorldMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

③ 创建controller包,书写业务代码:HelloController

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping("/hello")
    public String hello() {
        return "Hello SpringBoot";
    }

    @ResponseBody
    @RequestMapping("/test")
    public String test() {
        return "Test SpringBoot";
    }
}

④ 启动Spring Boot应用,在浏览器访问:localhost:8080/hello 即可查看在HelloController书写的功能

image-20201013092409514

4.2 快速创建Spring Boot应用

通过IDE工具可以快速创建Spring Boot项目,以IntelliJ IDEA为例:

选择我们需要的模块,向导会联网创建Spring Boot项目,默认生成的Spring Boot项目。主程序已经生成好了,我们只需要我们自己的逻辑。 具体步骤:

① 新建项目选择Spring Initializer

② 配置项目相关的环境

③ 选择需要的模块

具体的步骤截图

① 使用Spring Inietializer构建项目

image-20201013093652284

② 配置项目环境

image-20201013093857914

③ 选择所需的模块

image-20201013093950012

④ 输入项目名称和路径

image-20201013094539430

创建完成后的项目结构:

image-20201013101443989

resources文件夹中目录结构

  • static:保存所有的静态资源; js css images;
  • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页 面);可以使用模板引擎(freemarker、thymeleaf);
  • application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;

5. 分析Spring Boot创建的应用

5.1 pom文件

创建好的pom.xml文件,引用了父级的项目

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

pom.xml的父项目是 spring-boot-starter-parent-xxx.pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

spring-boot-starter-parent-xxx.pom 的父级项目是 spring-boot-dependencies-xxx.pom,是用来管理Spring Boot应用中所有依赖的版本,是Spring Boot的版本仲裁中心。以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖还是需要声明版本号)

Spring Boot启动器

spring-boot-starter-web: spring-boot-starter:spring-boot场景启动器,用于帮我们导入了所需模块正常运行所依赖的组件;

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

此依赖就是Spring Boot的场景启动器,打开这个Starter。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.3.4.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-json</artifactId>
        <version>2.3.4.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <version>2.3.4.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.2.9.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.9.RELEASE</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

实际上每个starter就是对相关模块依赖的整合,Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。

Spring官方文档中对starter的描述:参考链接

5.2 主程序类

/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        // 启动Spring应用
        SpringApplication.run(DemoApplication.class, args);
    }

}

@SpringBootApplication: Spring Boot应用注解在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就通过运行这个类的main方法来启动SpringBoot应用。

@SpringBootApplication 注解的构成

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

@SpringBootConfiguration :注明类是Spring Boot的配置类。此注解书写在某个类上,表示此类是个Spring Boot配置类;

  • @SpringBootConfiguration 注解由 @Configuration 注解组成;
  • @Configuration 用来标注某类是配置类。配置类可以替代配置文件,同时配置类也是IoC容器中组件,所以此注解由 @Component 注解组成。

@EnableAutoConfiguration :表示开启Spring Boot自动配置功能。以前我们需要配置的内容,Spring Boot可以帮助我们自动配置,此注解是通知Spring Boot开启自动配置;

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
  • @AutoConfigurationPackage :自动配置包的注解

  • @Import :Spring的底层注解,用于给容器导入一个组件

    @Import({AutoConfigurationImportSelector.class}) :导入的组件由 AutoConfigurationPackages.Registrar.class 将主配置类( @SpringBootApplication 标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;

    • EnableAutoConfigurationImportSelector:导入哪些组件的选择器。将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。会给容器中导入非常多的自动配置类 xxxAutoConfiguration 就是给容器中导入这个场景需要的组件名称,并配置好这些组件。有了自动配置类,可以省去我们自己手编写配置类注入组件等工作;
    • SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader) Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们进行配置;
    • J2EE的整体整合解决方案和自动配置都在 spring-boot-autoconfigure-2.3.4.RELEASE.jar 包中。

@ComponentScan :此注解表示开启自动包扫描

总结:@SpringBootApplication 注解是一个组合注解,通过 @SpringBootApplication 注解可以完成对Spring Boot的自动配置和组件扫描。

此处涉及到了很多的Spring 注解,后续会开个坑对Spring中常用的注解进行详细的介绍,敬请期待(≧∇≦)ノ