SpringBoot

SpringBoot

概述

SpringBoot是搭建spring应用的脚手架,可以迅速的搭建一个spring应用,是一个工具,而非框架。

解决问题:

复杂的配置

混乱的依赖管理

特点

  • 快速创建独立的Spring应用。
  • 提供固定的启动器依赖(启动器即Spring Boot提供的一个jar包)去简化组件配置,通过自己设置参数(.properties或.yml的配置文件),实现开箱即用(即快速使用)的效果
  • 只要你导入了某一个框架的启动器,那么该框架对应的依赖会全部自动导入
  • 提供了一些大型项目中常见的非功能性特性,如内嵌服务器(如tomcat、jetty、undertow)、安全、指标,健康检测、外部化配置等

搭建测试工程

image-20230706112359153

image-20230706112549535

image-20230706112627691

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. 凡是springboot项目都必须要继承一个父模块-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!-- Generated by https://start.springboot.io -->
    <!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->

    <groupId>com.yxh</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <!-- 2. 以后你需要使用哪个框架,那么就导入对应框架的启动器即可。
   比如:springmvc - starter-web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <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>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

启动类

package com.yxh.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// //表明是一个springboot应用
/*
@SpringBootApplication这个注解的本质是有以下三个注解:
    1.@Configuration【表示该类是一个配置类】
    2.@EnableAutoConfiguration【开启自动装配, 根据导入的依赖来完成该框架的自动配置。】
    ===springboot启动时会检测你导入了哪些框架的jar包,那么springboot就会给你完成哪些配置;例如springmvc(核心控制器,处理器映射器,处理器适配器,视图解析器的对象的创建)===
    3.@ComponentScan【默认扫描SpringbootNewApplication所在包以及子包下面所有使用了spring注解的类】
    ===spring注解 
    ioc:@Controller @Service @Component @Repository 
    DI:@Value @Autowired @Qualier 
    AOP:@Transational @Before @After===
*/

//springboot启动类
@SpringBootApplication
public class DemoApplication {
    //启动spring的容器,加载当前类上面的@SpringBootApplication注解
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

image-20230706113054505

image-20230706113102134

image-20230706113118477

image-20230706113154426

image-20230706113231940

image-20230706113333192

配置文件

application.properties

## 端口号
server.port=9090

## 项目访问路径
server.servlet.context-path=/test

springboot在启动完成自动配置的时候会去读取application.properties文件,根据key值读取相应的value

yml配置

  • YML文件格式是YAML(YAML Aint Markup Language)编写的文件格式,YAML是一种层级树键值对格式文件,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
  • YML文件的扩展名可以使用.yml或者.yaml。
当application.properties与application.yml两个文件同时存在时,当属性名相同时application.properties中的属性会 覆盖 application.yml中的属性。

加载顺序:

1、application.yml

2、application.properties

application.yml

server:
	port: 9090
	servlet:
		context-path: /test
## 如果需要自定义一些东西,只能写在application.yml或者application.properties中
## 自己定义的属性和值,需要自己去读取
student:
	name: 张三
	age: 18
	sex: 女

读取自定义配置

@Data
//spring注解 创建对象
@Component
//spring 要把数据给到实体类的前提是:1.属性名要对上,2.属性必须要有setter方法
@ConfigurationProperties(prefix="student")
public class User implements Serializable{
    private String name;
    private String sex;
    private Integer age;
}

或者

@Data
@Component
public class Student implements Serializable{
    @Value("${student.name}")
    private String name;
    @Value("${student.sex}")
    private String sex;
    @Value("${student.age}")
    private Integer age;
}

!!不支持注入复杂数据类型

集成mybatis

1.导入依赖

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

    <dependencies>
        <!--springmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!--myabtis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

2.配置yml

server:
  port: 8081
  servlet:
    context-path: /test
## 配置数据源
spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/medical?useSSL=false
## 映射文件/包名
mybatis:
  mapper-locations:
  - classpath:mapper/*.xml
  type-aliases-package: com.yxh.springboot_create_ssm.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
## 记录日志

3.编写实体类

4.编写mapper

接口上加@Mapper或者在Application.java上加@MapperScan(basePackages = "com.yxh.springboot.dao")

静态资源访问

image-20230707091453057

image-20230707091501063

image-20230707091509340

默认的静态资源访问路径有四个:

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public

第二步: 创建静态资源存储目录

我们习惯会把静态资源放在classpath:/static/目录下。拷贝"资料"文件夹目录下的test.jpg与test.js

image-20230711083600443

重启项目后访问

image-20230711083620864

拦截器的使用

思考: 拦截器也是我们经常需要使用的,在SpringBoot中该如何添加呢?

实现步骤

第一步

  • 第一步: 自定义拦截器实现HandlerInterceptor接口

    src\main\java\cn\itcast\interceptor\LoginInterceptor.java:

    package com.tyhxzy.interceptor;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Component
    public class Demo1Interceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("【前置通知】");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("【后置通知】");
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("【最终通知】");
    
        }
    }
    
    

第二步

  • 第二步: 自定义配置类实现WebMvcConfigurer接口,注册拦截器

    src\main\java\cn\itcast\configuration\MvcConfiguration.java

    package com.tyhxzy.config;
    
    import com.tyhxzy.interceptor.Demo1Interceptor;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class InterceptorConfig implements WebMvcConfigurer {
    
        @Autowired
        private Demo1Interceptor demo1Interceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(demo1Interceptor).addPathPatterns("/log");
        }
    }
    
    

    运行结果:

    image-20230711083747277

SpringBoot:整合Mybatis

整合步骤

引入mybatis启动器依赖(它依赖了jdbc启动器,jdbc启动器可以删除)

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

    <dependencies>
        <!--springmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!--myabtis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

配置mybatis相关属性

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///springdb?useSSL=false
    username: root
    password: root
mybatis:
  #别名扫描
  type-aliases-package: com.tyhxzy.model
  #开启下划线与小驼峰映射
  configuration:
    map-underscore-to-camel-case: true
    #打印sql的日志信息
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 #指定Mapper文件所在的位置 ,一旦指定不需要mapper.xml文件与类名同一个包文件名也可以不一样的。
  mapper-locations:
  #注意: classpath后面的:是没有空格的,
    - classpath:mappers/*.xml

用户实体(User)

package com.tyhxzy.model;
  
  import lombok.Data;
  
  @Data
  public class User {
  
      private Long id; //id
  
      private String username; //用户名
  
      private String password; //密码
  
      private Integer age; //年龄
  
      private String email; //邮箱
  
      private Integer sex; //性别
  
  
  }
  

数据访问接口(UserMapper)

  • 方式一 (@Mapper注解)

  • package com.tyhxzy.dao;
    
    import com.tyhxzy.model.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    @Mapper
    public interface UserDao {
    
    
        public List<User> findAll();
    }
    
    

    方式二 (@MapperScan注解)【推荐】

    package com.tyhxzy.dao;
    
    import com.tyhxzy.model.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    
    public interface UserDao {
    
    
        public List<User> findAll();
    }
    
    

    在启动类上添加数据访问接口包扫描:

    package com.tyhxzy;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * 注意: 使用mybatis的时候,这个springboot默认是不扫描dao接口的,两种解决方案:
     *      1. 每一个dao接口都添加一个@mapper注解,不推荐,因为较为繁琐
     *      2. 在启动类中@MapperScan注解扫描dao包
     */
    @SpringBootApplication
    @MapperScan(basePackages = "com.tyhxzy.dao")
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    
    
    • 说明: 这种方式的好处是,不用给每一个Mapper都添加注解。采用@MapperScan包扫描方式只需要添加一次注解。

    • 定义SQL语句(UserMapper.xml)

    • <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
      <mapper namespace="com.tyhxzy.dao.UserDao">
      
          <select id="findAll" resultType="user">
              select * from tb_user
          </select>
      
      </mapper>
      

      业务层 (UserService)

      package com.tyhxzy.service;
      
      import com.tyhxzy.model.User;
      import org.apache.ibatis.annotations.Select;
      
      import java.util.List;
      
      public interface UserService {
      
          public List<User> findAll();
      }
      
      
      package com.tyhxzy.service.impl;
      
      import com.tyhxzy.dao.UserDao;
      import com.tyhxzy.model.User;
      import com.tyhxzy.service.UserService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      import java.util.List;
      
      @Service
      public class UserServiceImpl implements UserService {
      
          @Autowired
          private UserDao userDao;
      
          @Override
          public List<User> findAll() {
              List<User> userList = userDao.findAll();
              return userList;
          }
      }
      
      

      控制器 (UserController)

      package com.tyhxzy.controller;
      
      import com.tyhxzy.model.User;
      import com.tyhxzy.service.UserService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      import java.util.List;
      
      @RestController
      @RequestMapping("/user")
      public class UserController {
      
          @Autowired
          private UserService userService;
      
          @RequestMapping("/findAll")
          public List<User> findAll(){
              return userService.findAll();
          }
      }
      
      

运行测试

image-20230711084218047

小结

  • 说出以下配置文件的意思
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl      日志输出
    map-underscore-to-camel-case: true       开启下划线与小驼峰映射
  mapper-locations:     
    - classpath:mappers/*.xml                      mapper文件路径     
  type-aliases-package: cn.itcast.model           别名扫描

SpringBoot:整合Junit

整合步骤

  • 引入test启动器依赖

    <!-- 配置test启动器(自动整合spring-test、junit) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
  • 编写测试类 (UserServiceTest)

    package com.tyhxzy.test;
    
    import com.tyhxzy.MybatisApplication;
    import com.tyhxzy.domain.User;
    import com.tyhxzy.service.UserService;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    /*
    注意:
        测试类如果与启动类不在同一级包或者是启动类子包,必须要指定启动类所在的位置
            例子: @SpringBootTest(classes = MybatisApplication.class)
    
    
     */
    @SpringBootTest
    public class MybatisTest {
    
    
        @Autowired
        private UserService userService;
    
    
        @Test
        public void test01(){
            List<User> userList = userService.findAll();
            System.out.println("用户列表:"+userList);
        }
    }
    
    
  • 使用junit的步骤
    • 导入spring-boot-starter-test
    • 编写一个测试类,类上使用@SpringBootTest注解

SpringBoot:项目打包部署

打成Jar包

  • 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中,可以使用maven的package
  • 运行: java -jar xxx(jar包名)

操作步骤

  • 第一步: 引入Spring Boot打包插件

        <!--打包的插件-->
        <build>
            <!--修改jar的名字-->
            <finalName>ROOT</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
  • 第二步: 执行命令

    # 清理、打包 跳过测试
    mvn clean package -Dmaven.test.skip=true
    
  • 第三步: 运行

    java -jar xxx.jar
    
  • 第四步: 浏览器访问 http://localhost:8080/findAll

打包jar的步骤

  • 在pom文件添加打包的插件
    • 在控制台进入到模块里面执行 mvn clean package -Dmaven.test.skip=true
      • 执行jar java -jar xxx.jar

SpringBoot :profile配置

我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。

1) profile是用来完成不同环境下,配置动态切换功能的。

2) profile配置方式

  • 多profile文件方式:提供多个配置文件,每种文件代表一种环境。

    • application-dev.properties/yml开发环境

    • application-test.properties|yml测试环境

    • application-pro.properties|yml生产环境

  • 一个yml文件配置多环境方式:

    • 在yml中使用 --- 分隔不同配置

3) profile激活方式

  • 配置文件: 再配置文件中配置:spring.profiles.active=dev

  • 虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev

  • 命令行参数:java –jar xxx.jar --spring.profiles.active=dev

演示

多文件方式

1、准备项目环境:新建项目、依赖、启动类

2、新建配置文件

application-dev.properties

server.port=8082

application-test.properties

server.port=8083

application-pro.properties

server.port=8084

3、此时启动项目发现端口还是8080,因为没有激活配置。

4、新建application.properties,激活配置

spring.profiles.active=dev

此时,使用的就是application-dev.properties配置文件的内容。

yml多文档

新建application.yml

---
server:
  port: 8082
spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: test
---
server:
  port: 8084
spring:
  profiles: pro
---
# 激活配置
spring:
  profiles:
    active: test

虚拟机参数

方式1: VM Options 参数:

image-20230711084649978

方式2:Program arguments:

image-20230711084704330

命令行参数

E:\>java -jar springboot-profile-1.0-SNAPSHOT.jar --spring.profiles.active=test
  • profile文件的作用,有几种方式
    • profile: 配置多环境的
      • 多个properties文件
      • 一个yml文件使用---分割
posted @ 2023-07-06 20:37  YxinHaaa  阅读(32)  评论(0)    收藏  举报