springboot

2023-09-17 15:48:00

Springboot入门

Springboot入门

springboot 提供了一种快速使用spring项目的方式,而不是对spring功能的增强,本文参考
https://www.bilibili.com/video/BV1Lq4y1J77x?p=12&vd_source=0882f549dac54045384d4a921596e234
可搭配视频教程查看
快速入门springboot

spring的缺点

配置繁琐

依赖繁琐

spring-boot的特点

自动配置

起步依赖,依赖传递

还有一些赋值功能,比如内嵌服务器,健康监测

创建一个spring-boot项目

spring-boot使用jar的打包方式

spring和spring-boot的业务代码编写方式完全一样

通过运行spring-boot的入口类运行 web服务

新建一个maven module
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改配置文件以及代码

修改pom.xml

当项目的依赖发生变化时记得更新maven项目

<?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>com.caigou</groupId>
    <artifactId>hello</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- springboot工程需要继承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

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

        <!-- thmeleaf模板引擎 -->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-thymeleaf</artifactId>-->
<!--        </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>
            </plugin>
        </plugins>
    </build>
</project>



  1. 添加HelloController
package com.caigou.controller;

//import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 注意使用RestController 而不是Controller
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello spring";
    }
}

  1. 添加Application启动类
package com.caigou.controller;

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);
    }

}

  1. 启动效果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

快速生成springboot项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

springboot起步依赖原理分析

在spring-boot-starter-parent中组合了各种技术信息,组合搭配了一套最优技术版本

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

我们的工程继承parent,引入starter,通过依赖传递可以方便的获取需要的jar包,不会存在版本冲突的问题

springboot配置

spring-boot是约定优于配置的,许多配置都有默认值,如果想更改这些配置的话,就要修改application.properties或者application.yml 文件

修改properties文件

在这里插入图片描述

# 更改服务端口
server.port=8081
# 自定义属性
name=abc
  1. 也可修改yml文件
    在这里插入图片描述
server:
  port: 8085

当一个目录中存在三种配置文件时,application.properties 优先级大于application.yml, application.yml 优先级大于application.yaml

yml文件示例以及注意事项

yml简介,以存储数据为目标,受多种语言的支持

# 缩进要使用空格, 统一文件内变量不能重名
# 对象
person:
  name: zhangsan
  age: 18

# 对象行内写法
person1: {name: zhangsan, age: 18}

# 数组
city:
  - beijing
  - shanghai

# 数组行内
city1: [beijing,shanghai]

# 常量
msg1: '13513 \n 11351'    # 不识别转义字符
msg2: "153135 \n 1531361" # 识别转义字符

#  参数引用
name: lisi

person2:
  name: ${name}

读取自定义配置文件内容

  1. @Value 和 autowired_environment 的代码

以下是获取yml文件中自定义属性的代码,两种方式获取值的字符串写法都一样,environment只需要注入一个environment,@Value 需要注入多个值,如果注入值比较少的话使用@Value比较好

package com.caigou.controller;

//import org.springframework.stereotype.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 注意使用RestController 而不是Controller
@RestController
public class HelloController {

    @Value("${name}")
    private String name;

    @Value("${person.age}")
    private int age;

    @Value("${city[0]}")
    private String city;

    @Value("${msg1}")
    private String msg1;

    @Value("${msg2}")
    private String msg2;

    @Autowired
    private Environment env;


    @RequestMapping("/hello")
    public String hello(){
        System.out.println(name);
        System.out.println(age);
        System.out.println(city);
        System.out.println(msg1);
        System.out.println(msg2);

        System.out.println(env.getProperty("person2.name"));
        return "hello spring";
    }
}
  1. 通过自定义bean

其中perfix用于指向配置文件中的自定义属性

package com.caigou.controller;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private String age;

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

    public String getAge() {
        return age;
    }

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

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

    public String getName() {
        return name;
    }
}

接着使用自动注入,便可以在代码中方便的使用属性

@Autowired
private Person person;
  1. 添加提示,修改pom.xml,在编写实体类和配置文件中会获得提示
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

springboot profile

不同环境的配置文件不一样,profile是用于动态配置切换的

profile配置方式

在这里插入图片描述
在主配置文件中添加如下代码,可选择使用的配置文件,等号后面的值,和文件application-后面的值要相同

spring.profiles.active=dev

---
server:
  port: 8081

spring:
  profiles: dev
---
server:
  port: 8082

spring:
  profiles: qa
---
server:
  port: 8083

spring:
  profiles: prod
---

spring:
  profiles:
    active: prod

不同配置的启动方式

  1. 虚拟机参数方式
    在这里插入图片描述
  2. 命令行参数
java -jar springboot_jar包名 --spring.profiles.activate=dev

可通过如下方式生成jar包
在这里插入图片描述

java -jar hello-1.0-SNAPSHOT.jar --spring.profiles.active=qa

springboot 内部加载顺序

项目根目录config下的配置文件

项目根目录的配置文件

resources的config下的配置文件

resources下的配置文件

多个文件形成一个互补的关系,从上到下优先级依次降低,项目根目录config下的配置文件最牛

外部配置文件加载顺序

可以使用spring.config.application指定外部配置文件的位置,默认会加载jar包所在目录的外部配置文件,以及jar包config目录下的配置文件,外部配置文件的优先级要高于内部配置文件

spring boot 整合其他框架

  1. 编写业务代码
package controller;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void print(){
        System.out.println("123");
    }
}
  1. 编写测试方法
package controller;

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;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = HelloApplication.class)
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testPrint(){
        userService.print();
    }
}

spring boot整合redis

测试代码

package controller;

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(classes = HelloApplication.class)
public class RedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void setTest(){
        redisTemplate.boundValueOps("name").set("zhangsan1");
    }

    @Test
    public void getTest(){
        Object name = redisTemplate.boundValueOps("name").get();
        System.out.println(name);
    }

}

修改配置文件

spring:
  profiles: prod
  redis:
    host: 175.24.184.55
    password: *********

spring boot 整合mybatis

  1. 添加依赖
<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
  1. 编写Mapper,mapper包位于controller包下
package controller.mapper;

import 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 user")
    List<User> findAll();

}

  1. 编写测试脚本
package controller;

import controller.mapper.UserMapper;
import domain.User;
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(classes = HelloApplication.class)
public class UserTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testQueryAll(){
        List<User> result = userMapper.findAll();
        System.out.println(result);
    }
}

  1. 写配置文件
spring:
  datasource:
    url: jdbc:mysql://ip:3306/caigou?useSSL=false&serverTimezone=UTC
    username: root
    password: HI79+=B8b1nr
    driver-class-name: com.mysql.cj.jdbc.Driver

使用xml配置文件

  1. 编写mapper
package controller.mapper;

import domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Property;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface UserXmlMapper {

    List<User> findAll();
}

  1. 编写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="controller.mapper.UserXmlMapper">

<!--    //namespace的值是dao接口的全限定名称(即在哪个包下面要全部写出来-->
<!--    //增删改查子标签的id要和接口中的方法名一样-->

    <!--实现查询功能的select子标签-->
    <select id="findAll" resultType="domain.User">
        select * from user order by id desc
    </select>

    <!--实现插入功能的insert子标签-->
<!--    <insert id="insertStudent">-->
<!--        insert into student values(#{id},#{name},#{email},#{age})-->
<!--    </insert>-->

<!--    &lt;!&ndash;实现修改功能的update子标签&ndash;&gt;-->
<!--    <update id="updateEmp">-->
<!--            UPDATE emp SET name = #{name} WHERE id = #{id};-->
<!--    </update>-->

<!--    &lt;!&ndash;实现删除功能的delete子标签&ndash;&gt;-->
<!--    <delete id="deleteEmp">-->
<!--            DELETE FROM emp WHERE id = #{id};-->
<!--    </delete>-->
</mapper>

文件位于

在这里插入图片描述
3. 添加application.xml 配置

mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml

spring boot高级.

spring-boot自动配置

condition, spring可以选择性的创建bean

spring boot 部署方式

打jar包

打war包
将jar包打包至服务器上,后台启动程序 https://blog.csdn.net/weixin_46504244/article/details/125628546

对部署好的springboot进行压测

可参考以下链接 https://blog.csdn.net/Loners_fan/article/details/127890332

ab -n 100 -c 100 http://172.16.1.6/
执行-n代表总请求数 -c 代表一次请求的发送的并发请求数

对于空负载的springboot web程序和python web程序两者在测试机器的表现是差不多的

更多推荐

强化学习从基础到进阶-案例与实践[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现对于深度强化学习这块规划为:基础单智能算法教学(g

【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka

作者简介前言博主之前写过一个完整的MQ系列,包含RabbitMQ、RocketMQ、Kafka,从安装使用到底层机制、原理。专栏地址:https://blog.csdn.net/joker_zjn/category_12142400.html?spm=1001.2014.3001.5482本文是该系列的清单综述,会拉通

Kafka实现高性能消息队列分析

ApacheKafka是一款开源的、分布式的、高吞吐量的流平台。它被广泛用于实时数据流的处理,包括实时流分析、实时日志处理、实时事件处理等。Kafka的主要设计目标是高吞吐量、可扩展性、容错性和持久性。在本篇文章中,我们将深入探讨Kafka如何实现高性能消息队列,包括服务端和客户端的架构,以及关键的设计和优化技术,如服

Kafka概论

前言任何消息中间件,除了基础组件架构外,核心特性无非三个,消息可靠性、消息模型、吞吐量,本文要聊的正是这些东西,其余诸如API、下载安装、集群搭建等都是死的,而且会随着版本的变动而改变,这类东西针对不同版本,查官方文档即可。目录前言1.概述1.1.特点1.2.架构2.消息模型2.1.发布订阅模式2.2.点对点2.3.消

java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发

Java版工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离功能清单如下:首页工作台:待办工作、消息通知、预警信息,点击可进入相应的列表项目进度图表:选择(总体或单个)项目显示1、项目进度图表2、项目信息施工地图:1、展示当前角色权限下能看到的施工地图(

从统计语言模型到预训练语言模型---统计语言模型

语言模型从历史上来看,自然语言处理的研究范式变化是从规则到统计,从统计机器学习到基于神经网络的深度学习,这同时也是语言模型发展的历史。要了解语言模型的发展历史,首先我们需要认识什么是语言模型。语言模型的目标是建模自然语言的概率分布,即确定语言中任意词序列的概率,它提供了从概率统计角度建模语言文字的独特视角。语言模型在自

uniapp——实现电子签名功能——基础积累

话说,2020年刚来杭州的时候,有用到过uniapp,距今已有三年时间了,果然全忘了,哈哈[笑中带泪]昨天遇到一个需求:就是要实现pdf文件的预览,着实费了我很多的时间,连晚饭都没有吃好。。。这里写目录标题`先写一个小的功能点记录:文档预览功能的实现`——`openDocument``放弃web-view``放弃ifr

MySQL进阶篇2-索引的创建和使用

索引mkdirmysqltar-xvfmysqlxxxxx.tar-cmyqlcdmysqlrpm-ivh.....rpmyuminstallopenssl-develsystemctlstartmysqldgerp'temporarypassword'/var/log/mysqld.logmysql-uroot-pm

Python 06 之面向对象基础

😀前言在日常编程和软件开发中,我们通常会遇到各种各样的问题,其中很多问题都可以通过面向对象的程序设计方法来解决。面向对象编程不仅可以使代码更加组织化和系统化,而且还可以提高代码的重用性和可维护性。.在本教程中,我们将探索Python语言中面向对象编程的基本概念。我们将从最基本的类和对象的定义开始,然后深入探讨类的属性

【python百炼成魔】python之字典详解

前言今天我们一起来探讨python的另外一种类型:字典,如果你没有看过列表和元组,建议先学习列表和元组。【python百炼成魔】python之元组详解【python百炼成魔】python之列表详解文章目录前言字典的概念语法格式及字典的创建字典的日常操作1.获取字典的值2.获取字典视图的三个方法3.增加元素,修改元素,删

基于Java在线教学质量评价系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

热文推荐