框架|SpringBoot

103 阅读3分钟

Spring Boot 框架提供了一套简单的Spring模块依赖和管理工具,简化Spring应用复杂的搭建及开发过程,从而避免了开发人员处理复杂的模块依赖和版本冲突问题,同时提供打包即可用的Web服务.

特点:

  • 快速创建独立的 Spring 应用程序。
  • 嵌入Tomcat和Undertow等Web容器,实现快速部署。
  • 自动配置JAR包依赖和版本控制,简化Maven配置。
  • 支持不需要XML配置,通过注解自动扫描装配Spring实例。
  • 提供诸如性能指标、健康检查、外部配置等线上监控和配置功能。

初始 Spring Boot 项目

  1. 修改 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <!--1. 定义 spring boot 项目,并从 parent repositor 获取对应的资源-->
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.2.6.RELEASE</version>
      <relativePath/> 
   </parent>
   <!--2. 定义项目 ID -->
   <groupId>com.zion</groupId>
   <artifactId>spring-demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <name>spring-demo</name>
   <description>Demo project for Spring Boot</description>
   <!--3. 定义 Java 版本 -->
   <properties>
      <java.version>8</java.version>
   </properties>
   <dependencies>
    <!-- 添加 spring boot starter web 依赖 -->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
    <!-- 添加 spring boot starter test 依赖 -->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
    
    <!-- 添加打包插件 -->
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>
  1. 添加 application.properties 获取 application.yml 文件
# 服务端口
server.port=9090
# 服务名称
server.name=hello
  1. 添加启动类 ApplicationMain
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
public class ApplicationMain {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationMain.class, args);
    }
}
  1. 添加控制器 HelloController
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/message")
    public String getMessage() {
        return "Greetings from Spring Boot!";
    }

}
  1. 执行 ApplicationMain main 方法,访问地址http://localhost:9090/message 得到结果如下所示:

image.png

这样就创建好对应的 spring 应用程序,具体的工程结构如下图所示:

image.png

Spring Boot Application Staters

初始化 Spring Boot 项目时,我们引入了 starter-web 和 starter-test 两个包就可以有对应的 web 和 测试功能。如果要使用Spring的JPA功能进行数据库访问,只需要应用程序在项目中加入springboot-starter-data-jpa依赖即可,具体的依赖细节由Starters统一处理,不需要应用程序分别处理各个JAR包的依赖关系。

为什么在引用 starter 不需要制定对应的版本呢?

初始化 Spring Boot 项目时, 配置 pom.xml 的 parent 为 spring-boot-starter-parent,它的 parent 为 spring-boot-dependencies, 它配置依赖包需要的版本例子,如下所示:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot</artifactId>
      <version>2.2.6.RELEASE</version>
    </dependency>
    ...
  </dependencies>
</dependencyManagement>

Spring Boot Starter 使用 MYSQL 为例

启动 mysql

有两种方式:

  1. 下载 mysql 安装包, 执行启动命令
  2. 使用 docker 镜像的方式启动

在这里使用 docker 镜像的方式启动,添加文件 docker-compose.yml

version: '2'

services:
  mysql:
    image: mariadb:10.3.34
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: test
      MYSQL_PASSWORD: mysqltest
      MYSQL_DATABASE: test
      MYSQL_BIND_ADDRESS: 0.0.0.0
      TZ: Asia/Shanghai
    command:
      - --lower_case_table_names=1
      - --character-set-server=utf8
    ports:
      - 3306:3306

添加 jdbc starter 依赖

文件 pom.xml

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

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <exclusions>
      <exclusion>
         <artifactId>protobuf-java</artifactId>
         <groupId>com.google.protobuf</groupId>
      </exclusion>
   </exclusions>
</dependency>

添加 数据库链接

文件 application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

使用服务器组件

  1. 添加 MyBean Dao 层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Component;

@Component
public class MyBean {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public String getDate() {
        return jdbcTemplate.query("select curdate()", (ResultSetExtractor<String>) rs -> {
            if (rs.next()) {
                return rs.getString(1);
            } else {
                return null;
            }
        });
    }
}
  1. 修改 HelloController 调用 Dao 的方法

这里为了测试,让 Controller <-调用- Dao ,实际上在业务复杂的情况下更好的方式是 Controller <- Service <- Dao,为了数据库和业务层分离

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Autowired
    private MyBean bean;

    @GetMapping("/message")
    public String getMessage() {
        return "Greetings from Spring Boot!";
    }

    @GetMapping("/currentDate")
    public String getCurrentDate(){
        return bean.getDate();
    }

}

测试

启动 ApplicationMain 方式,页面上执行 http://localhost:9090/currentDate 得到对应的结果如下图所示:

image.png