Java学习Day56:暴打舔狗!(SpringBoot)

news2024/11/26 10:22:19

1.springboot简介

  • 核心能力:Spring容器、日志、自动配置AutoCongfiguration、Starters

  • web应用的能力:MVC、嵌入式Web服务器

  • 数据访问(持久化):关系型数据库、非关系型数据库

  • 强大的整合其他技术的能力

    • 只要是Java中牛逼的技术,在SpringBoot中都有良好的支持

  • 测试:强悍的应用测试

2.springboot版本问题

Spring Boot 的3.1.0正式发行版,使用Java 17,对应的Spring版本是6.0.9。

Servlet容器版本:

SpringBoot 支持如下的嵌入式Servlet容器,Spring Boot应用程序最低支持到Servlet 3.1的容器。

NameServlet Version
Tomcat10.16.0
Tomcat 9.04.0
Jetty 9.43.1
Undertow 2.04.0

3.springboot快速入门

  1. 创建Maven工程(使用java即可,使用springboot可能会出现版本问题)

  2. pom.xml文件中配置起步依赖

 <!--继承SpringBoot父POM文件-->

<!--web 开发的相关依赖-->

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.0</version>
    </parent>
  1. 编写SpringBoot启动引导类

@Configuration//配置类
@EnableAutoConfiguration//开启自动配置
@ComponentScan//包扫描
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }
}
  1. 编写Controller

  2. 访问http://localhost:8080/hello测试

4、SpringBoot原理分析

1.starters

==starters是依赖关系的整理和封装==。是一套依赖坐标的整合,可以让导入应用开发的依赖坐标更方便。

starter本质是一个pom.xml文件,里存储了很多坐标

利用依赖传递的特性:帮你把依赖打包了,starter

有了这些Starters,你获得Spring和其整合的所有技术的一站式服务。无需配置(自动配置)、无需复制粘贴依赖坐标,一个坐标即可完成所有入门级别操作。举例:Web开发,只需要导入spring-boot-starter-web

2.依赖管理的原理

BOM(Bill of Materials)依赖清单,是由Maven提供的功能,<dependencyMangament>

BOM内定义成套相互兼容的jar包版本集合

使用依赖时,只需依赖该BOM文件,即可放心的使用清单内的依赖jar包,且无需版本号。

BOM设计初衷:方便维护项目依赖版本升级

依赖管理(Dependency Management)

  1. 继承了spring-boot-starter-parent的好处和特点

    • 默认编译Java 17

    • 默认编码UTF-8

    • 通过spring-boot-denpendencies的pom管理所有公共Starter依赖的版本

    • spring-boot-denpendencies通过Maven的一个<dependency management>特性来实现版本管理

    • 随用随取,不用继承父类所有的starter依赖。

  2. POM文件中的Maven插件

    <!-- 作用:将一个SpringBoot的工程打包成为可执行的jar包 -->
    <build> 
    <plugins>
     <plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    </plugin> 
    </plugins> 
    </build>
    

    如果想使用父pom文件中的任何插件,无需配置即可使用

3.自动配置(AutoConfiguration)原理

SpringBoot采用约定大于配置设计思想,将所有可能遇到的配置信息提前配置好,写在自动配置的jar包中。每个Starter基本都会有对应的自动配置。

SpringBoot帮我们将配置信息写好,存放在一个jar包中:spring-boot-autoconfigure-3.1.0.jar

jar包里,存放的都是配置类,让配置类生效的"规则类"

查看启动类注解@SpringBootApplication

追踪步骤:

  1. @SpringBootApplication

  2. @EnableAutoConfiguration

  3. @Import({AutoConfigurationImportSelector.class})

  4. org.springframework.boot.autoconfigure.AutoConfiguration.imports

  5. org.springframework.boot.autoconfigure.web.servlet.EmbeddedWebServerFactoryCustomizerAutoConfiguration

分析小节:

  • Starter:是一套依赖关系的整理和封装

    • 让我们更加专注于业务开发,无需关心依赖导入,依赖冲突,及依赖的版本

    • 在pom文件导入starter既可使用对应的功能

  • 依赖管理:依赖管理是对依赖坐标的抽取和复用,统一管理依赖坐标的版本。

    • 实现了依赖坐标的版本管理

    • starter随用随取

    • 避免了继承所有父类starter的依赖的臃肿

    • 避免了记忆所有starter的麻烦。

  • 自动配置:预先写入配置类,封装到AutoConfiguration的jar包中,按需求加载配置信息。

    • 基于约定大于配置的设计思想

    • 极大的降低了Spring应用配置的复杂度

    • 代码实现原理:@SpringBootApplication-->@EnableAutoConfiguration-->@AutoConfigurationPackage(spring-boot-autoconfigure-3.1.0.jar)

    • 原理的核心在于:spring-boot-autoconfigure-3.1.0.jar包

  • 当Spring Boot应用启动时,@EnableAutoConfiguration注解中的@Import(AutoConfigurationImportSelector.class)会导入AutoConfigurationImportSelector类。
  • AutoConfigurationImportSelector类的selectImports方法会扫描所有具有META-INF/spring.factories文件的jar包,并读取这些文件中与EnableAutoConfiguration对应的配置类列表。
  • 这些配置类(通常是xxxAutoConfiguration形式的类)会被加载到Spring容器中,作为自动配置的Bean。

5.SpringBoot的配置文件

yml配置文件规则:

  1. 大小写敏感

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

  3. 使用缩进表示层级关系:

  4. 缩进不允许使用tab,只允许空格

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

  6. ‘#’表示注释,从这个字符一直到行尾,都会被解析器忽略。

  7. 数组和集合使用 “- ”表示数组每个元素

配置文件属性注入Bean@Value

6.SpringBoot与其他技术集成

1.集成MyBatis

依赖,其余都一样


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

        <!--导入SpringBoot和MyBatis的整合包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

2 集成Spring Data Redis

依赖

        <!--导入redis的整合包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

配置文件

#配置redis数据库连接信息
spring:
  data:
    redis:
      host: localhost
      port: 6379

3.SpringBoot代码测试

<!--spring boot测试依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

4.springboot打jar包和war包

jar

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.x.x</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

war

<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>
  • 如果是 WAR 包,主类需要继承 SpringBootServletInitializer,并重写 configure 方法。
  • import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    
    @SpringBootApplication
    public class YourApplication extends SpringBootServletInitializer {
        public static void main(String[] args) {
            SpringApplication.run(YourApplication.class, args);
        }
    }
    

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

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

相关文章

nascpolarssh

安装cpolarCpolar快速入门教程&#xff1a;群晖NAS系列 - cpolar 极点云官网 设置ssh: 然后&#xff1a;ssh tobecpolard.26.tcp.cpolar.top -p 12774即可进入 跳板机&#xff1a; 设置端口转向ssh -f -N -L 23:localhost:22 tobe192.168.31.44 ssh tobecpolard.26.tcp.cpola…

相关矩阵图——Python实现

import matplotlib.pyplot as plt import numpy as np# 创建一些正常分布的数据 mean [0, 0] cov [[1, 1], [1, 2]] x, y np.random.multivariate_normal(mean, cov, 3000).T# Set up the axes with gridspec fig plt.figure(figsize(6, 6)) grid plt.GridSpec(4, 4, hspa…

学习笔记:黑马程序员JavaWeb开发教程(2024.10.30)

5.3 请求响应-请求-简单参数 客户端使用postman实现&#xff0c;服务端通过idea&#xff0c;又两种请求方式&#xff0c;springboot的更加简洁方便 对于RequestParam&#xff0c;可以通过设置requiredflase来让参数不是必须传递的 在请求参数过多的时候&#xff0c;可以将请求参…

rabbitmq高级特性(2)TTL、死信/延迟队列、事务与消息分发

目录 1.TTL 1.1.设置消息过期时间 1.2.设置队列过期时间 2.死信队列 2.1.介绍 2.2.演示 3.延迟队列 3.1.模拟实现延迟队列 3.2.延迟队列插件 4.事务与消息分发 4.1.事务 4.2.消息分发 1.TTL 所谓的ttl&#xff0c;就是过期时间。对于rabbitmq&#xff0c;可以设置…

pip使用

pip全称pip install package,是python第三方包sitepackage管理的工具&#xff0c;安装&#xff0c;卸载第三方包。安装python时可以选择安装pip&#xff0c;或自己安装pip 查看pip是否安装&#xff1a;pip --version 安装pip &#xff1a;pip python -m pip install --upgrade…

早期进程间的通信

目录 IO进程&#xff08;day06&#xff09; 无名管道 有名管道 信号 IO进程&#xff08;day06&#xff09; 无名管道 原理图 无名管道的特点 只能用于有亲缘关系之间的进程无名管道可以看成是一种特殊的文件&#xff0c;对于它的读写可以使用文件IO如read、write函数.无名管道是…

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en&#xff0c;可以获取多个linux内核版本下的存储栈概略图&#xff0c;下面是kernel-4.0的存储栈概略图&#xff1a; 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD&#xff1a;固态存储核心…

Python爬虫入门篇!

毕设是做爬虫相关的&#xff0c;本来想的是用java写&#xff0c;也写了几个爬虫&#xff0c;其中一个是爬网易云音乐的用户信息&#xff0c;爬了大概100多万&#xff0c;效果不是太满意。之前听说Python这方面比较强&#xff0c;就想用Python试试&#xff0c;之前也没用过Pytho…

从0开始搭建一个生产级SpringBoot2.0.X项目(三)SpringBoot接口统一返回和全局异常处理

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot接口统一返回和全局异常处理&#xff0c;使用ControllerAdvice ExceptionHandler 的组合来实现。 一、pom文件新增依赖 <dependency><groupId>com.alibaba</groupId><ar…

【MySQL】实战篇—项目需求分析:ER图的绘制与关系模型设计

在软件开发中&#xff0c;数据库是信息系统的核心部分&#xff0c;合理的数据库设计能够显著提高系统的性能和可维护性。 ER图&#xff08;实体-关系图&#xff09;是数据库设计的重要工具&#xff0c;它通过图形化的方式描述了数据实体及其相互关系&#xff0c;帮助开发者和设…

输入整数n,求,i从1到n的和

// 第一题&#xff0c;输入整数n&#xff0c;求&#xff0c;i从1到n的和 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() {int n 0;printf("请输入一个整数n:");scanf("%d", &n);int i 0;int j 0;for (j 1; j < n; j){i…

频率限制:WAF保护网站免受恶意攻击的关键功能

频率限制&#xff08;Rate Limiting&#xff09;是一项有效的安全措施&#xff0c;用于控制每个 IP 地址的访问速率&#xff0c;以防止恶意用户利用大量请求对网站进行攻击&#xff0c;例如防止 CC 攻击等。频率限制不仅能保护网站资源&#xff0c;还能提升服务的稳定性。 下面…

C++基础: string(3)

文章目录 1. 两道题目1. [387. 字符串中的第一个唯一字符 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/problems/first-unique-character-in-a-string/description/)2.[415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/proble…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…

【Java】方法的使用 —— 语法要求、方法的重载和签名、方法递归

目录 1. 方法基础知识 1.1 方法的概念 1.2 语法格式 * 注意事项【与C不同】 1.3 return —— 返回值的严格检查【比C语言严格】 2. 形参与实参的关系 3. 方法重载 3.1 什么是方法重载&#xff1f;为什么要方法重载&#xff1f; 3.2 方法重载的规则 4. 方法签名 5. 递…

Chrome和Firefox如何保护用户的浏览数据

在当今数字化时代&#xff0c;保护用户的浏览数据变得尤为重要。浏览器作为我们日常上网的主要工具&#xff0c;其安全性直接关系到个人信息的保密性。本文将详细介绍Chrome和Firefox这两款主流浏览器如何通过一系列功能来保护用户的浏览数据。&#xff08;本文由https://chrom…

20241030在荣品PRO-RK3566开发板的适配Rockchip原厂的buildroot的时候配置DTS中的电源域

20241030在荣品PRO-RK3566开发板的适配Rockchip原厂的buildroot的时候配置DTS中的电源域 2024/10/30 17:38 请问 RK3566开发板上的 电源配置 和 DTS文件是如何对应的&#xff1f; 底板原理图 PRO-RK3566-B-20210329原理图.pdf vccio4-supply 是1.8V。 对不上呀&#xff1f; Z:…

Java 内部类(13/30)

目录 Java 内部类 1. 内部类的概念和类型 1.1 成员内部类 1.2 局部内部类 1.3 匿名内部类 1.4 静态内部类 2. 内部类的用途和优势 3. 内部类的注意事项 总结与后续 Java 内部类 内部类&#xff08;Inner Class&#xff09;是定义在另一个类内部的类。在 Java 中&…

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

WPF拖拽交互全攻略及实现自定义拖拽控件及数据交换技巧解析

目录 1. 基本概念2 . 实现拖拽功能概述需要要实现基本的拖放&#xff0c;完成以下任务&#xff1a;其他操作 示例3.1 设置拖拽源&#xff0c;拖拽开始3.2 设置拖拽效果DragDropEffects 3.3 设置放置目标&#xff0c;处理拖拽数据拖拽输入DragEnter事件DragOver事件拖拽离开Drag…