Spring Boot快速入门

Spring boot

一、Spring Boot 介绍

1.1 引言

  • 为了使用 ssm 框架去开发,准备 ssm 框架的模块配置
  • 为了 spring 整合第三方框架,单独写 xml 配置文件
  • 导致 ssm 项目后期 xml 文件特别多,维护 xml 文件的成本很高
  • ssm 部署也是很麻烦的,依赖第三方的容器
  • ssm 开发方式很笨重

1.2 spring boot 介绍

SpringBoot 是由 Privota 团队研发的,SpringBoot 并不是一门技术,只是将之前常用的 Spring,SpringMVC,data-jpa 等常用的框架封装到了一起,并隐藏了这些框架的整合细节,实现敏捷开发

Spring Boot 就是一个工具类。

1.3 Spring Boot 的特点

  1. Spring Boot 项目不需要模板化的配置
  2. 在 Spring Boot 中整合第三方的框架是,只需要导入相应的 starter 依赖包,就自动整合了
  3. Spring Boot 默认只有一个.properties 的配置文件,不推荐使用 xml, 后期会采用,.java 文件去编写配置信息
  4. SpringBoot 工程部署时,采用的是 jar 包的方式,内部自动依赖 Tomcat 容器,提供了多环境的配置。
  5. 后期要学习的微服务框架 Spring Cloud 需要建立在 Spring Boot 的基础上。

二、Spring Boot 快速入门

2.1 快速构建 Spring Boot 工程

  1. 选择项目的构建类型

  1. 项目的描述

  1. 指定版本和需要的依赖

第一次构建 springboot 项目时,会下载大量的依赖,要保证 Maven 配置了阿里云的私服

  1. 修改 pom.xml 的依赖
<dependency>-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 将上面修改成下面 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>
  1. 编写一个 testController 的类
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController()
public class Testcontroller {

<span class="hljs-meta">@GetMapping("test")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">test</span><span class="hljs-params">()</span>{
    <span class="hljs-keyword">return</span> <span class="hljs-string">"Hello SpringBoot!"</span>;
}

}

  1. 启动过程,启动 main 的方法
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FirstSpringbootApplication {

<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> {
    SpringApplication.run(FirstSpringbootApplication.class, args);
}

}

2.2 spring boot 工程中的目录结构

  1. pom.xml 文件
  2. 指定了一个父工程,指定了当前工程中为 springboot,帮助我们声明了 starter 依赖的版本
  3. 项目的元数据:包名,项目名,版本号
  4. 指定了 properties 信息:指定了 java 的版本 1.8
  5. 导入依赖:默认情况下导入 spring-boot-starter, spring-boot-starter-test
  6. 插件:spring-boot-maven-plugin
  1. .gittignore 文件:默认帮助我们忽略了一些文件和目录
  1. src 目录
- src
  - main
  	- java 
  		- 包名
  			启动类.java   # 需要将controller类,放在启动类的子类包中或者同级包下
  	- resources
  		- static   # 存放静态资源的
  		- templates  # 存储模板页面的
  		application.porperties  # SpringBoot提供的唯一的配置文件
  - test # 测试用的

2.3 三种启动方式

  1. 运行启动类的 main 方法即可运行 springboot 工程

  2. 采用 maven 的命令去运行 spring Boot 工程

mvn spring-boot:run

  1. 采用 jar 包的方式运行
  • 将当前的项目打包成一个 jar 文件

    mvn clean package

  • 通过 java -jar jar 文件

三、Spring Boot 常用注解

3.1 @Configuration 和 @Bean

之前使用 ssm 去开发的时候,在 xml 文件中编写 bean 标签。

但是 spring boot 不推荐使用 xml 文件

@configuration 注解相当于 beans 标签

@Bean 注解相当于 bean 标签

​ id="方法名 | 注解中的 name 属性(优先级更高)"

​ class="方法的放回结果"

@Configuration           // 代表当前类是一个配置类
public class UserConfig {
<span class="hljs-meta">@Bean(name = "user1")</span>
<span class="hljs-keyword">public</span> User <span class="hljs-title function_">user</span><span class="hljs-params">()</span>{
    <span class="hljs-type">User</span> <span class="hljs-variable">user</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">User</span>();
    user.setId(<span class="hljs-number">1</span>);
    user.setName(<span class="hljs-string">"张三"</span>);
    <span class="hljs-keyword">return</span> user;
}

<span class="hljs-comment">/*
&lt;beans .....&gt;  @Configuration
    @Bean
    &lt;bean id="user1" class"com.gopan.firstspringboot.entity.User"&gt;
&lt;/beans&gt;
*/</span>

}

3.2 @SpringBootApplication

@SpringBootApplication 是一个组合注解

  1. @SpringBootConfiguration 就是 @Comfiguration 注解,代表我的启动类激素 hi 一个配置类
  1. @EnableAutoConfiguration 帮你实现自动装配的,SpringBoot 工程启动时,运行一个 SpringFactoriesLoader 的类,加载 META-INF/spring.factories 配置类(已经开启的),通过 SpringFactoriesLoader 中的 load 方法,以 For 循环的方式,一个一个地加载。

好处:无需编写大量的整合配置信息,只需要按照 SpringBoot 提供好了约定去整合即可。

坏处:如果导入了 starter 依赖,那么你就需要填写他必要的配置信息。

手动关闭自动装配指定内容

@SpringBootApplication(exclude = QuartzAutoConfiguration.class)
  1. @ComponentScan 就相当于 <context:component-scan basePackage="包名"/>

帮助扫描注解的

四、Spring Boot 常用·配置

4.1 Spring Boot 的配置文件的格式

SpringBoot 的配置文件支持 properties 和 yml, 甚至还支持 json

更推荐使用 yml 文件格式:

  1. yml 文件 会根据换行和缩进帮助咱们管理配置文件的所在位置。

    使用 properties 文件配置很难管理,需要手动管理

  2. yml 文件,相比于 properties 更轻量级一些

yml 文件的劣势:

  1. 严格遵循换行和所缩进
  2. 在填写 value 时,一定要在:后面跟上空格

4.2 多环境配置

在 application.yml 文件中添加一个配置项:

spring:
 profiles:
   active: 环境名

在 resourcea 目录下,创建多个 application- 环境名.yml 即可

在部署工程时,通过 java -jar 文件 - - spring.profiles.active = 环境名

4.2 引入外部配置文件信息

和传统的 ssm 的方式一样,通过 @value 的注解去获取 properties/yml 文件中的内容

如果在 yml 文件中需要编写大量的自定义的配置,并且具有统一的前缀时,可以采用下方方式

@ConfigurationProperties(prefix = "aliyun")
@Component
@Data
public class AliyunProperities {
<span class="hljs-keyword">private</span> String  xxxx;

...

}

aliyun:
  xxxx: xxxxxxxx
  ...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

4.4 热加载

  1. 导入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
  1. 修改 settings 中的配置

  1. 修改内容后,可以通过 build 重新构建工程

五、Spring Boot 整合 Mybits

5.1 xml 方式整合 Mybatis

  1. 导入依赖
<!--        mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>

<!-- druid 连接 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>

    <span class="hljs-comment">&lt;!--        mybatis--&gt;</span>
    <span class="hljs-comment">&lt;!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.mybatis.spring.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>mybatis-spring-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>1.3.2<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>

  1. 编写配置文件
// 1. 准备实体类

@Data
public class Air {

private long id;

private long districtId;

private java.sql.Date monitorTime;

private long pm10;

private long pm25;

private String monitoringStation;

private java.sql.Date lastModifyTime;

}
// ----------------------------------------

@Data
public class District {

private long id;

private String name;

}

// 2.2 准备 Mapper 接口
public interface AirMapper {
    List<Air> findAll();
}
// 在启动类中添加直接,扫描 Mapper 接口所在的包
@MapperScan(basePackages = "com.gopan.firstspringboot.mapper")
<!-- 2.3 准备映射文件 -->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gopan.firstspringboot.mapper.AirMapper">
<!--    List<Air> findAll();-->
    <select id="findAll" resultType="Air">
        select * from air
    </select>

</mapper>
# 添加 yml 文件的配置信息
# Mybatis 配置
mybatis:
  # 扫描映射的文件
  mapper-locations: classpath:mapper/*.xml
  # 配置别名扫描的包
  type-aliases-package: com.gopan.firstspringboot.entity
  configuration:
    # 开启驼峰映射
    map-underscore-to-camel-case: true
# 2.3 指定连接数据库的信息

# 连接数据库的信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///air?serverTimezone=UTC
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  1. 测试

在 Mapper 接口的位置,直接右键 -> goto -> Test

会自动创建当前的接口的测试类,在 test 目录下。

让当前的测试类,继承 FirstSpringbootApplicationTests 测试类(在 class 前添加,public)

class AirMapperTest extends FirstSpringbootApplicationTests {
    @Autowired
    private AirMapper airMapper;
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">void</span> <span class="hljs-title function_">findAll</span><span class="hljs-params">()</span> {
    List&lt;Air&gt; list = airMapper.findAll();
    <span class="hljs-keyword">for</span> (Air air : list) {
        System.out.println(air);
    }
}

}

5.2 注解方式整合 Mybatis

  1. 创建 District 的 Mapper 接口
public interface DistrictMapper {
    List<District> findAll();
}
  1. 添加 Mybatis 注解

针对增删改查:@Insert @Delete @Update @Select

还是需要在启动类中添加 @MapperScan 注解

public interface DistrictMapper {
<span class="hljs-meta">@Select("select * from district")</span>
List&lt;District&gt; <span class="hljs-title function_">findAll</span><span class="hljs-params">()</span>;

<span class="hljs-meta">@Select("select * from district where id = #{id}")</span>
District <span class="hljs-title function_">findOneById</span><span class="hljs-params">(<span class="hljs-meta">@Param("id")</span> Integer id)</span>;

}

  1. 测试,看到执行的 sql 语句
# 查看 sql 语句
logging:
  level:
    com.gopan.firstspringboot.mapper: DEBUG
class DistrictMapperTest extends FirstSpringbootApplicationTests {
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> DistrictMapper mapper;

<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">void</span> <span class="hljs-title function_">findAll</span><span class="hljs-params">()</span> {
    List&lt;District&gt; list = mapper.findAll();
    <span class="hljs-keyword">for</span> (District district : list) {
        System.out.println(district);
    }
}

<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">void</span> <span class="hljs-title function_">findOneById</span><span class="hljs-params">()</span> {
    <span class="hljs-type">District</span> <span class="hljs-variable">dis</span> <span class="hljs-operator">=</span> mapper.findOneById(<span class="hljs-number">5</span>);
    System.out.println(dis);
}

}

5.3 SpringBoot 整合分页助手

  1. 导入依赖
<!-- pageHelper 依赖 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.5</version>
</dependency>
  1. 测试使用
@Test
public void findByPaage(){
    // 1. 执行分页
    PageHelper.startPage(1,1);
<span class="hljs-comment">// 2. 执行查询</span>
List&lt;Air&gt; list = airMapper.findAll();

<span class="hljs-comment">// 3. 封装PageInfo对象</span>
PageInfo&lt;Air&gt; pageInfo = <span class="hljs-keyword">new</span> <span class="hljs-title class_">PageInfo</span>&lt;&gt;(list);

<span class="hljs-comment">// 4. 输出</span>
<span class="hljs-keyword">for</span> (Air air : pageInfo.getList()) {
    System.out.println(air);
}

}