SpringBoot基础

Spring Boot基础快速开发

SpringBoot 概述

SpringBoot官方开发文档spring boot reference guide

springBoot快速入门指南官方地址

Spring Boot 功能

  • 自动配置

  • 起步依赖(传递依赖):将具备某种功能的坐标打包到一起,并提供一些默认的功能.

  • 辅助功能:内置tomcat等

Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。

SpringBoot 快速入门

快速构建springboot项目(推荐)

使用springboot构建应用官方地址

快速构建springboot官方网址



基于maven搭建SpringBoot工程
  • 创建Maven项目





  • 导入SpringBoot起步依赖

    pom.xml中添加

    java 复制代码
        <groupId>com.emprock</groupId>
        <artifactId>springboot_helloworld</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    	<!-- 从Spring Boot默认继承 -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.8.RELEASE</version>
        </parent>
    
        <!-- 为web应用程序添加典型的依赖项 -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>

  • 定义Controller

    HelloController类中

    java 复制代码
    package com.emprock.controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    public class HelloController {
        @RequestMapping("/hello")
        public String hello(){
            return "hello world";
        }
    }
  • 编写引导类

    java 复制代码
    package com.emprock;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    //引导类,项目入口
    @SpringBootApplication
    public class HelloApplication {
        public static void main(String[] args) {
            SpringApplication.run(HelloApplication.class,args);
        }
    }

  • 启动测试

    控制台显示Started HelloApplication in 25.596 seconds (JVM running for 33.273)启动成功

    浏览器网址输入localhost:8080/hello返回hello world则项目成功运行

遇到的问题:无法导入@SpringBootApplication包

解决方案:pom.xml中spring-boot-starter-parent版本修改为1.4.0.RELEASE及以上版本

SpringBoot 起步依赖原理分析

1) spring-boot-starter-parent

定义了各种技术的版本信息,组合了一套最优搭配的技术版本,不指定版本父类里自动匹配版本,指定版本注意版本冲突问题

2) spring-boot-starter-web

在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。

我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题。

SpringBoot 配置

配置文件在resources文件中

配置文件分类

  • SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties(server.port=8080)或者application.yml(application.yaml)(server: port: 8080)进行配置。
  • 默认配置文件名称:application
  • 在同一级目录下优先级为:properties > yml > yaml
yaml

YML文件是以数据为核心的,比传统的xml方式更加简洁。

  • 大小写敏感

  • 数据值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱,idea自动将tab转换为空格)。

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • "#" 表示注释,从这个字符一直到行尾,都会被解析器忽略

例:

yaml 复制代码
server:    
	port: 8080
    address: 127.0.0.1

YAML:数据格式

  • 对象(map):键值对的集合。

    person:
      name: aaa
    #行内写法
    person: {name: aaa}
    
  • 数组:一组按次序排列的值

    address:
    - bbb
    - ccc
    #行内写法
    address: {bbb,ccc}

  • 纯量:单个的、不可再分的值

    msg1: 'hello /n world' #单引忽略转义字符
    msg2: "hello /n world" #双引识别转义字符

YAML:参数引用

name: lisi 
person:
	name: ${name} # 引用上边定义的name值

读取配置文件内容

1) @Value单个注入

    @Value("${person.name}")
    private String name;
    @Value("${address[0]}")
    private String address;
    @Value("${msg1}")
    private String msg1;

2) Environment注入一个对象

    @Autowired
    private Environment env;
    @RequestMapping("/hello")
    public String hello(){
        System.out.println(env.getProperty("person.name"));
        System.out.println(env.getProperty("address[0]"));
        System.out.println(env.getProperty("msg1"));
        return "hello world";
    }

3) @ConfigurationProperties对象与控制属性的绑定

//调用类中代码
@Autowired
public Person person; 

package com.emprock.springbootinit;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
//实体类中代码
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private int age;
    private String[] address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String[] getAddress() {
        return address;
    }

    public void setAddress(String[] address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

resources下yml类中
person:
  name: aaa
  age: 11
  address:
    - bbb
    - ccc
profile
  1. profile是用来完成不同环境下,配置动态切换功能的。

2) profile配置方式

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

    application-dev.properties/yml 开发环境

    application-test.properties/yml 测试环境

    application-pro.properties/yml 生产环境

    在application.properties中调用对应的环境spring.profiles.active=dev

  • yml多文档方式:在yml中使用 --- 分隔不同配置

    ---
    server:
      port: 8081
    
    spring:
      config:
        activate:
          on-profile: test
    ---
    server:
      port: 8082
    
    spring:
      config:
        activate:
          on-profile: dev
    ---
    server:
      port: 8083
    
    spring:
      config:
        activate:
          on-profile: pro
    ---
    #调用配置
    spring:
      profiles:
        active: test
    

3) profile激活方式

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

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

​ 或在Program argvments指定: --spring.profiles.active=pro




打包后命令行参数(工作中使用):java --jar .\程序jar包名.jar --spring.profiles.active=pro

在jar包文件目录空白处按shift+右键,选在此处打开Power shell窗口,执行上面的命令即可

ctrl+c结束运行

内部配置加载顺序

Springboot程序启动时,会从以下位置加载配置文件:

1.file:./config/:当前项目下的/config目录下

2.file:./ :当前项目的根目录

3.classpath:/config/:classpath的/config目录

4.classpath:/ :classpath的根目录

加载顺序为上文的排列顺序,高优先级配置的属性会生效

外部配置加载顺序

外部配置作用:快速配置项目配置

通过官网查看外部属性加载顺序: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

SpringBoot 整合其他框架

SpringBoot整合Junit。
  • 搭建SpringBoot工程

    见文章开头

  • 引入starter-test起步依赖

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <scope>test</scope>
          </dependency>
    
  • 编写测试类

java 复制代码
import org.springframework.stereotype.Service;
@Service
public class UserService {
    public void add(){
        System.out.println("add..");
    }
}
  • 添加测试相关注解@RunWith(SpringRunner.class)@SpringBootTest(classes = 启动类.class)及编写测试方法
java 复制代码
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.junit4.SpringRunner;
//测试类
@RunWith(SpringRunner.class)
//包名路径或子包与测试包路径相同可以不指定启动类
@SpringBootTest(classes = SpringBootInitApplication.class)
class SpringBootInitApplicationTests {
    @Autowired
    private UserService userService;
    @Test
    public void testAdd(){
        userService.add();
    }
}
SpringBoot整合Redis。
  • 搭建SpringBoot工程

见文章开头

  • 引入redis起步依赖

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-redis</artifactId>
          </dependency>
    
  • 配置redis相关属性

    spring:
    data:
    redis:
    host: 127.0.0.1
    port: 6379

  • 注入RedisTemplate模板与编写测试方法,测试

    运行redis-server.exe

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringBootRedisApplicationTest {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        public void testSet(){
            redisTemplate.boundValueOps("name").set("hello");
        }
    
        @Test
        public void testGet(){
            Object name = redisTemplate.boundValueOps("name").get();
            System.out.println(name);
        }
    }
    

SpringBoot整合MyBatis.
  • 搭建SpringBoot工程与准备mysql数据

    cmd运行mysql -uroot -proot

    sql 复制代码
    CREATE DATABASE `springboot`;
    USE `springboot`;
    DROP TABLE IF EXISTS `t_user`;
    CREATE TABLE `t_user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    insert  into `t_user`(`id`,`username`,`password`) values (1,'zhangsan','123'),(2,'lisi','234');
  • 引入mybatis起步依赖,添加mysql驱动

            <!-- mybatis依赖-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>3.0.3</version>
            </dependency>
            <!-- mysql驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--可不加,无影响-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter-test</artifactId>
                <version>3.0.3</version>
                <scope>test</scope>
            </dependency>
    
  • 编写DataSource和MyBatis相关配置

    spring:
      datasource:
        url: jdbc:mysql:///springboot?serverTimezone=UTC
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
    

  • 定义表和实体类

    public class User {
        private int id;
        private String username;
        private String password;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }
    

  • 编写dao和mapper文件/纯注解开发

    • 注解开发

      import com.emprock.springbootmybatis.domain.User;
      import org.apache.ibatis.annotations.Mapper;
      import org.apache.ibatis.annotations.Select;
      import org.springframework.stereotype.Repository;
      import java.util.List;
      @Mapper
      @Repository
      public interface UserMapper {
      @Select("select * from t_user")
      public List<User> findAll();
      }

    • mapper文件开发

    java 复制代码
    import com.emprock.springbootmybatis.domain.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.springframework.stereotype.Repository;
    import java.util.List;
    @Mapper
    @Repository
    public interface UserXmlMapper {
        public List<User> findAll();
    }

    ​ resources文件下创建mapper文件中创建UserMapper.xml

    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.emprock.springbootmybatis.mapper.UserXmlMapper">
        <select id="findAll" resultType="user">
            select * from t_user
        </select>
    </mapper>

    ​ yml文件中

    mybatis:
      mapper-locations: classpath:mapper/*Mapper.xml #mapper映射文件路径
      type-aliases-package: com.emprock.springbootmybatis.domain
      # config-location:  #指定mybatis的核心配置文件
    

  • 测试

    import com.emprock.springbootmybatis.domain.User;
    import com.emprock.springbootmybatis.mapper.UserMapper;
    import com.emprock.springbootmybatis.mapper.UserXmlMapper;
    import org.junit.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.junit4.SpringRunner;
    
    import java.util.List;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringBootMybatisApplicationTests {
        //注解开发
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void testFindAll() {
            List<User> list = userMapper.findAll();
            System.out.println(list);
        }
        //mapper文件开发
        @Autowired
        private UserXmlMapper userXmlMapper;
        @Test
        public void testFindAll2() {
            List<User> list = userXmlMapper.findAll();
            System.out.println(list);
        }
    }
    
  • 出现的错误信息

    org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.emprock.springbootinit.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    

    解决:版本问题导致,mybatis-spring-boot-starter由1.3.0版本改为3.0.3即可

SpringBoot 项目部署

jar包(推荐)

新建模块

选择Web > Spring Web

创建类

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/findAll")
    public String findAll(){
        return "success";
    }
}

右侧maven > Lifecycle > package打包

运行jar包命令

java -jar .\springboot-admin-server-0.0.1-SNAPSHOT.jar
war包

pom

    <!--添加到<properties>上面一行-->
    <packaging>war</packaging>

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class SpringbootAdminServerApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootAdminServerApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(SpringbootAdminServerApplication.class);
    }
}

右侧maven > Lifecycle > package打包

将war包放入外置tomcat的webapps中即可

虚拟目录端口号后面需要加上springboot/

相关推荐
路在脚下@27 分钟前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
啦啦右一29 分钟前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien30 分钟前
Spring Boot常用注解
java·spring boot·后端
苹果醋32 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
Hello.Reader2 小时前
深入解析 Apache APISIX
java·apache
菠萝蚊鸭2 小时前
Dhatim FastExcel 读写 Excel 文件
java·excel·fastexcel
旭东怪3 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
007php0073 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
∝请叫*我简单先生3 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
ssr——ssss3 小时前
SSM-期末项目 - 基于SSM的宠物信息管理系统
java·ssm