springBoot工程入门

news2024/9/23 9:33:38

文章目录

  • 基本知识
  • 快速搭建springBoot工程
  • 起步依赖·原理分析
    • spring-boot-starter-parent
    • spring-boot-starter-web
  • 配置
    • yaml
      • 数据格式
      • 读取配置
    • profile
      • profile配置方式
        • 多profile文件方式
        • yml多文档方式
      • profile激活方式
    • 内部配置加载顺序
    • 外部配置加载顺序
  • 整合其他框架
    • Junit
    • redis
    • mybatis

springBoot是快速构建spring的技术

基本知识

spring缺点:1. 配置繁琐 2. 依赖繁琐(导包的版本怎么确定)

SpringBoot功能

  1. 自动配置
  2. 起步依赖,简化依赖的配置
  3. 辅助功能 eg.嵌入式服务器、安全、指标

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

官网文档地址:Spring Boot Reference Documentation

在创建项目时候,使用jar的方式打包
引导类是项目入口,运行main方法就可以启动项目
使用springboot和spring构建的项目,业务代码编写方式完全一样

快速搭建springBoot工程

搭建springBoot工程,定义HelloController.hello()方法,返回“Hello SpringBoot”

步骤① 创建Maven项目
步骤② 导入springBoot起步依赖
springboot工程需要继承的父工程:Inheriting the Starter Parent POM

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

    <dependencies>
        <dependency>
            <!--web开发的起步依赖-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

步骤③定义Controller
在这里插入图片描述

步骤④编写引导类
在这里插入图片描述

步骤⑤启动测试
运行后,显示在8080端口
在这里插入图片描述
浏览器访问http://localhost:8080/hello
在这里插入图片描述
或者使用idea的快速构建即可代替上面的配置。
在这里插入图片描述
在这里插入图片描述

起步依赖·原理分析

spring-boot-starter-parent

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

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

我们的工程继承parent、引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并不会存在版本冲突等问题。
在这里插入图片描述
一直查看父工程的配置文件,最终可以看到<properties>下面定义了很多版本信息
<dependencyManagement>中的依赖都根据<properties>来确定包的版本,这就是版本锁定

spring-boot-starter-web

查看配置文件,发现这个包已经自动将一些其他的包导入进来了
在这里插入图片描述

配置

默认配置文件明:application

2种配置文件明:propertiesyml/yaml

springBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)配置

  • properties
    在这里插入图片描述
  • yaml
    在这里插入图片描述
    如果存在多个配置,根据优先级读取:application.properties > application.yml > application.yaml

yaml

拓展名可以使用.yml.yaml

比较简洁,以数据为中心,
相较于xml,可以少写尾标签
相较于profile,可以看出来同一类的属性

# profile
server.port: 8081

# yaml
server:
  port: 8082

# xml
<server>
	<port>8083</port>
</server>

基本语法

  • 大小写敏感
  • 数据值前面必须有空格作为分隔符
  • 用缩进表示层级关系
    • 缩进不允许使用Tab键,只能用空格,不同系统Tab键的空格数不同
    • 缩进的空格数目不重要,只要相同层级的元素左对齐就行
  • # 表示行注释,从这个字符到行尾,都会被解析器忽略

数据格式

  • 对象(map):键值对的集合
person:
  name: soon
  
person: {name: soon} # 行内写法
  • 数组:一组按次序排列的值,使用‘-’ 表示数组的每个元素
city:
  - beijing
  - shanghai
 
city: [beijing,shanghai] # 行内写法 
  • 纯量:单个值,不可再分
msg1: 'hello1 \n beijing' # 单引号 忽略转义字符
msg2: "hello2 \n shanghai" # 双引号 识别转义字符
  • 参数引用:${key}

读取配置

  1. @Value获取单个值比较方便,值多了就不方便
  2. Environment
  3. @ConfigurationProperties配置和对象相护传递

@Value
在这里插入图片描述
Environment.getProperty

import org.springframework.core.env.Environment;

@RestController
public class HelloController {
    @Autowired
    private Environment env;

    @RequestMapping("/getName")
    public String hello(){
        System.out.println(env.getProperty("person.name"));
        System.out.println(env.getProperty("city[0]"));
        return env.getProperty("name");
    }
}

@ConfigurationProperties
在这里插入图片描述添加注解处理器的依赖
在这里插入图片描述

profile

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

profile配置方式

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

    • application-dev.properties/yml开发环境
    • application-test.properties/yml测试环境
    • application-pro.properties/yml生产环境
  • yml多文档方式

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

多profile文件方式

多了三个不同环境的配置:dev pro test,切换环境的时候,只用在application.properties中指定spring.profiles.active
在这里插入图片描述运行之后发现端口就是8081
在这里插入图片描述

yml多文档方式

--- # 分割成不同部分
server:
  port: 8081
spring:
  config:
    on-profile: dev
---
server:
  port: 8082
spring:
  config:
    on-profile:  test
---
server:
  port: 8083
spring:
  config:
    on-profile: pro
---
spring:
  profiles:
    active: dev # 使用这个环境

在这里插入图片描述

profile激活方式

  • 配置文件:在配置文件中配置: spring.profiles.active=dev ,详见多profile文件方式
  • 虚拟机参数:在VM options指定: -Dspring.profiles.active=dev
  • 命令行参数: java -jar xxjar --spring.profiles.active=dev

虚拟机参数
在这里插入图片描述

命令行参数
在这里插入图片描述

在这里插入图片描述

D:\Java\code\IdeaProjects\springboot-profiles\target> java -j .\springboot-profile-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro

在这里插入图片描述
--spring.config.location=配置文件路径 使用外部配置文件
--server.port=8088 端口号改为8088
--server.servlet.context-path=/hello 修改项目的访问路径,默认为/

内部配置加载顺序

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

  1. file:./config/: 当前项目下的/config目录下
  2. file:./ :当前项目的根目录
  3. classpath:/config/: classpath的/config目录
  4. classpath:/ : classpath的根目录

优先级由高到低
在这里插入图片描述
打包后,javaresources路径下的内容都会放到classpath路径下

外部配置加载顺序

通过官网查看外部属性加载顺序,后面的属性源可以覆盖前面的属性源中定义的值。
在这里插入图片描述

整合其他框架

Junit

SpringBoot整合Junit,步骤:
①搭建SpringBoot工程
②引入starter-test起步依赖

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

③编写测试类

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void add(int a) {
        System.out.println("添加" + a);
    }
}

④添加测试相关注解

  • @RunWith(SpringRunner.class)
  • @SpringBootTest(classes =启动类.class),如果这个测试类和启动了是同一个包,则可以写成@SpringBootTest
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJunitApplication.class) //main中的引导类
public class UserServiceTest {
    @Autowired
    private UserService userService;

    @Test
    public void testAdd(){
        userService.add(1);
    }
}

⑤编写测试方法

在这里插入图片描述

redis

SpringBoot整合redis,步骤:
①搭建SpringBoot工程
在这里插入图片描述

②引入redis起步依赖
在这里插入图片描述

③配置redis相关属性
如果不配置,就是用本机的;可以在配置文件中配置

spring:
  data:
    redis:
      host: 127.0.0.1 # redis的主机ip
      port: 6379

④在测试类中注入RedisTemplate模板

    @Autowired
    private RedisTemplate redisTemplate;

⑤编写测试方法,测试
在这里插入图片描述

mybatis

SpringBoot整合mybatis,步骤:
①搭建SpringBoot工程
在这里插入图片描述
②引入mybatis起步依赖,添加mysq|驱动

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

③编写DataSource和MyBatis相关配置

spring:
  datasource:
    url: jdbc:mysql:///springboot
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

④定义表和实体类

create table t_user
(
    id       int auto_increment
        primary key,
    username varchar(32) collate utf8mb4_unicode_ci null,
    password varchar(32) collate utf8mb4_unicode_ci null
);
public class User {
    Integer id;
    String name;
    String password;
    //生产toString get set 方法
}

⑤编写sql

@Mapper
public interface UserMapper {
    @Select("select * from t_user")
    public List<User> findAll();
}

⑥测试

@RunWith(SpringRunner.class)
@SpringBootTest
class MybatisApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        List<User> all = userMapper.findAll();
        for (User user : all) {
            System.out.println(user);
        }
    }

}

在这里插入图片描述
也可用xml写sql语句

spring:
  datasource:
    url: jdbc:mysql:///springboot
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# mybatis
mybatis:
  mapper-locations: classpath:Mapper/*Mapper.xml # mapper映射文件路径
  type-aliases-package: com.example.mybatis.domain # 实体类所在的包,这样resultType就可以不写包名,直接写类名就行

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.Java运算符

文章目录前言一、运算符和表达式二、运算符(1)算术运算符a.数字相加b.字符串相加c.字符相加(2)自增自减运算符应用场景:(3)赋值运算符(4)关系运算符(5)逻辑运算符应用场景:短路逻辑运算符练习(6)三元运算符练习1练习二(7)运算符优先级总结前言 一、运算符和表达式 二、运算符 …

Elasticsearch的Mapping使用分析(es7官方文档解读)

目录mapping是什么动态mapping默认动态mapping设计自己的mapping检测模板运行时字段dynamic参考ES 7版本官方文档 官方7.17文档 挑了一些我觉得重要的点总结 如有谬误&#xff0c;欢迎指正 mapping是什么 在ES里创建一个索引 PUT demo_index {"mappings": {"…

三十二、Kubernetes中Service详解、实例第二篇

1、概述 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资源&…

HTML常见转义字符

HTML中常见的转义字符 其他一些常用的字符实体&#xff1a; 链接 http://www.w3chtml.com/html/character.html

PID优化系列之给定值斜坡函数(PLC完整代码+Simulink仿真测试)

很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1 低通滤波器对给定值进行平滑。给定值缓慢变化在很多闭环控制系统里很重要,比如收放卷在初始建张阶段目标值不建议突变容易将卷材拉断(…

初识 Django(Python WEB 框架)

初识 Django&#xff08;Python WEB 框架&#xff09;参考描述优劣 Django&#xff08;部分&#xff09;优势功能完备&#xff0c;开箱即用开发效率高Admin 管理后台安全ORM可扩展劣势性能模板过渡封装获取长期支持版&#xff08;Long Time Support&#xff0c;LTS&#xff09;…

基于Java+SpringBoot+Vue企业资源规划系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…

开源项目介绍

文章目录简介经验casdoorkeycloaklatexopenMP简介 不经常见的开源项目&#xff0c;第一次接触。 经验 如果是已经开源的软件&#xff0c;使用起来非常的平稳&#xff0c;问题也少。原因是已经经过了多年的历练&#xff0c;已经稳当下来&#xff0c;该发现的问题已经解决的差…

unplugin-vue-components 不能识别组件的自动导入的类型 (pnpm)

引言 unplugin-vue-components 是一款能帮助组件自动导入的库&#xff0c;简单点的说&#xff0c;你不需要使用import xx from xxx.vue 这行语句也能实现导入的效果。 <script setup lang"ts"> import ScreenAdpter from compontents/ScreenAdpter/index.vue i…

[前端笔记——多媒体与嵌入] 6.HTML 中的图片+视频+音频内容

[前端笔记——HTML介绍] 6.HTML 中的图片1.HTML中的图片1.1怎样将一幅图片放到网页上&#xff1f;1.2备选文本1.3宽度和高度1.4.Image titles 图片标题1.5通过为图片搭配说明文字的方式来解说图片1.6CSS背景图片2.视频和音频内容2.1Web中的视频和音频2.1.1<video>元素2.1…

在linux中部署SpringBoot+Vue前后端分离应用

最近有任务需求&#xff0c;自己在linux中通过docker虚拟环境的方式部署了SpringBoot和Vue前后端分离的项目&#xff0c;现在做点总结&#xff0c;给需要的小伙伴分享。不足之处多多指正。关于在linux中安装docker&#xff0c;可以查看博主前几篇博客按照步骤进行安装&#xff…

【JUC系列】ReentrantLock实现本地锁的源码分析

使用场景 public class ReentrantLockTest {private static ReentrantLock lock new ReentrantLock();public static void main(String[] args) {new Thread(()->{lock.lock();// do somethingSystem.out.println("111");try {Thread.sleep(Integer.MAX_VALUE);…

[ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择

前几天看到一个问答帖&#xff0c;我回答完了才发现这个帖子居然是去年的也没人回复&#xff0c;其中他问了一些华为云的问题&#xff0c;对于其中的一些概念&#xff0c;这里来总结讲解一下&#xff0c;希望对学习华为云的小伙伴有所帮助。 文章目录区域&#xff08;Region&am…

致 Tapdata 开源贡献者:聊聊 2022 年的进展和新一年的共建计划

岁末年初&#xff0c;在开源领域刚埋下一颗生机勃勃的种子的 Tapdata&#xff0c;想和正在关注我们的开发者&#xff0c;聊聊这一年的进展和新一年的共建计划。 2022年4月&#xff0c;Tapdata 宣布开源 PDK&#xff08;Plugin Development Kit&#xff09;&#xff0c;将自身的…

前端js实现文件多次添加累加上传和选择删除(django+js)- 添加累加文件上传 (一)

前言 原本的多文件上传功能在选择文件时&#xff0c;只能通过同一范围的鼠标框选或者ctrl/shift多选取选择文件&#xff0c;这样选择文件很不灵活&#xff0c;而且在确定之后如果漏选了文件&#xff0c;再次点击上传按钮时会清空表单里的文件信息&#xff0c;只能重复之前的操…

数据库mysql调优

问题描述: mysql dba在mysql服务端启用了连接在空闲一定时间 (10分钟) 后&#xff0c;就自动关闭连接(连接失效)的功能&#xff0c;导致java端连接池在空闲一段时间后&#xff0c;连接被自动关闭(自动失效)。为了避免这种情况出现&#xff0c;可以在dbcp上配置空闲的时候检测连…

PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2、Add-in Card 它们有啥区别?这些概念你搞清楚了吗?

搞硬件或通信的“攻城狮”们&#xff0c;免不了要和各种通信协议及接口打交道。比如&#xff0c;我们经常接触PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2(NGFF)、Add-in Card这些概念&#xff0c;作为“攻城狮”队伍中的一员&#xff0c;你搞清楚它们之间的关系了吗&…

Python爬虫教你爬取csdn作者排行榜

(一)两种爬取方式介绍 1.自动化测试工具 安装好驱动(以前的selenium文章有教程),然后进行元素定位&#xff0c;最后数据提取&#xff0c;用xls表格进行持久化存储 2.requests库 利用基本方法发起请求&#xff0c;获得json数据进行持久化存储 本篇文章先讲解第二种&#xf…

洛谷——树与图dp与状压dp

文章目录[NOIP1996 提高组] 挖地雷题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码最大食物链计数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码[ZJOI2006]三色二叉树题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #…

浅说 INSERT/块参照/BlockReference

在AutoCAD中使用INSERT命令插入一个块时&#xff0c;生成块参照实体&#xff0c;也叫INSERT实体&#xff0c;在ObjectARX中&#xff0c;对应类AcDbBlockReference。反正就这么一个东西&#xff0c;名儿还挺多&#xff0c;我家乡有句话叫“二嫚她婆婆俩名”&#xff0c;莫非这是…