当前位置: 首页 > news >正文

[Spring] SpringBoot2 简介(一)—— 基础配置

目录

一、SpringBoot 简介

1、Spring 的缺点

2、SpringBoot 功能

二、SpringBoot 入门案例

1、实现步骤

2、访问服务器

3、入门小结

4、Idea 快速构建 SpringBoot 工程

5、起步依赖无需版本号

6、主启动类的在项目中的位置(*重要*)

三、SpringBoot 配置

1、配置文件分类

2、yaml 基本介绍

3、yaml 基本语法

4、yaml 数据格式

四、读取配置文件内容

1、@Value

2、Environment 类

3、@ConfigurationProperties

4、读取配置文件的问题汇总

五、Profile

1、为什么需要 profile

2、profile 的配置方式

3、profile 激活方式之多 profile 文件

4、profile 激活方式之 yml 多文档

5、虚拟机参数与命令行参数

6、激活 profile 问题汇总

7、项目内部配置文件加载顺序

六、SpringBoot 整合其他框架

1、整合 Junit

2、整合 Redis

3、整合 MyBatis(演示注解开发)

4、框架整合问题汇总


一、SpringBoot 简介

1、Spring 的缺点

(1)配置繁琐

  • Spring 的组件代码是轻量级的,但是它的配置文件是重量级的。
  • 在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写程序的时间。

(2)依赖繁琐

  • 自己导入 maven 很可能会导致依赖冲突,还得自行判断版本号。

2、SpringBoot 功能

(1)自动配置(核心)

  • SpringBoot 的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring 配置应该用哪个,不该用哪个。该过程是 SpringBoot 自动完成的。

(2)起步依赖(核心)

  • 起步依赖本质上是一个 Maven 项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
  • 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

(3)辅助功能

  • 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。就比如 Tomcat 服务器,不需要再手动配置了。

总的来说,SpringBoot 提供了一种快速开发 Spring 项目的方式,而不是对 Spring 功能上的增强。

二、SpringBoot 入门案例

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

1、实现步骤

在整个步骤中,不需要写一行配置,没有引入 Tomcat 的插件。

(1)导入 SpringBoot 起步依赖

  • 我的 JDK 是 16 版本,只适合用 2.7.3,根据自己的 JDK 版本选择。 
<!-- SpringBoot 需要继承的父工程 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version>
</parent><dependencies><!-- web 开发的起步依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

(2)定义 Controller

  • 需要注意的是,由于我们没有定义视图解析器,所以会导致 404。
  • 既然没有解析器和对应 html,那么可以将返回值显示到 /hello 的页面上,加上 @ResponseBody 即可。
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HelloController {@RequestMapping(value = "/hello")@ResponseBodypublic String hello() { // 在 /hello 页面输出 hello, springboot!System.out.println("/hello");return "hello, springboot!";}
}

(3)编写引导类

  • 引导类一般以 Application 作为后缀。
  • 这是 SpringBoot 的入口。
package com.demo.application;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class HelloApplication {}

(4)编写测试代码

  • 测试类(假的,别用)
public class HelloApplicationTest {@Testpublic void test1() {SpringApplication.run(HelloApplication.class);}
}
  • 在实际使用中,我们需要在 main 方法中执行 run 方法,因为服务器需要保持运行
  • 也就是在引导类中的 main 方法,调用 run 方法
package com.demo.application;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);}
}

2、访问服务器

当我们在 main 方法中调用 run 方法后,该如何访问服务器呢?

在输出的信息中其实有这么一些信息:

显然 Tomcat 服务器已经在 8080 端口开放了,直接访问即可。

3、入门小结

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

4、Idea 快速构建 SpringBoot 工程

如果我们连工程需要引入什么样的依赖都不想自己动手写,那么可以直接使用 SpringBoot 的生成器。但是需要一个联网环境。

(1)新建,选择 SpringInitial

  • 服务器 URL:是 Spring 构建工程的服务器。

(2)直接选择我们需要的依赖

(3)项目结构

5、起步依赖无需版本号

在入门案例中,我们写的 POM 文件里,spring-boot-starter-web 是没有规定版本号的。

这是因为,在 SpringBoot 的父工程里,已经设定了大量的依赖的版本号,这也是 SpringBoot 能防止依赖冲突的原因之一。

6、主启动类的在项目中的位置(*重要*)

这是非常重要的一个问题,主启动类的位置决定了 SpringBoot 自动扫描的范围。

  • 如果其他框架的包(如 mapper),不在主启动类的同目录、子目录下,那么 SpringBoot 自动扫描是找不到其他框架的包的。
  • 要么将主启动类放置在父目录;
  • 要么在主启动类中进行包扫描(缺点就是各类框架扫描注解不一样);

三、SpringBoot 配置

1、配置文件分类

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

(1)语法的大致区别

  • properties:
prop.driver=110
  • yaml:
prop:port: 110
  • yaml 的缩进以及 : 后的空格都有讲究。

(2)简单使用

  • 当我们在 properties 中,将端口号修改为 8088,就会发现可以从 8088 访问服务器了。

  • 还可以配置自定义属性,只不过需要我们手动加载这部分内容。

(3)加载顺序(优先级)

当 properties、yml、yaml 都存在 application 配置文件时,加载顺序为:

properties > yml > yaml

此时,在低优先级中的同一个名称的属性就会失效。

2、yaml 基本介绍

YAML全称是YAML Ain't Markup Language。

  • YAML是一种直观的能够被电脑识别的的数据数据序列化格式;
  • 容易被人类阅读,容易和脚本语言交互,可以被支持 YAML 库的不同的编程语言程序导入;
  • YAML 文件的扩展名可以使用 .yml 或者 .yaml;
  • 特点:简洁,以数据为核心;

可以发现,properties 不方便看出层级关系;xml 能看出层级关系,但是写标签繁琐;yaml 只需要相同缩进,就能得出层级关系。

3、yaml 基本语法

4、yaml 数据格式

(1)示例

(2)参数引用

  • 使用 ${ } 可以引用其他对象。 

四、读取配置文件内容

读取配置文件的方法有好几种:

  • @Value
  • Environment 类
  • @ConfigurationProperties

1、@Value

具体使用:https://blog.csdn.net/qq_31960623/article/details/116902786

(1)application.yml 文件:

address:- beijing- wuhan- shanghaimyUser:name: wytage: 20hobby:- c++- python- java:web: 'java \n web'spring: "spring \n springboot"address: ${address[1]}

(2)Controller 代码:

@Value(value = "${myUser.hobby[2].java.web}")
private String web;@Value(value = "${myUser.hobby[2].java.spring}")
private String spring;@Value(value = "${myUser.address}")
private String address;@RequestMapping(value = "/testAtValue")
@ResponseBody
public String testAtValue(@Value(value = "${myUser.name}") String username) {System.out.println("username = " + username);System.out.println("web = " + web);System.out.println("spring = " + spring);System.out.println("address = " + address);return "testAtValue";
}

(3)输出结果:

(4)结果分析:

  • 从 web 和 spring 的获取中我们发现,数组中的对象,在使用 [ ] 后,还需要 .点运算 才能的到对象;
  • 从 web 和 spring 的输出来看,单引号不会识别转义字符;
  • 从 address 的获取来看,yml 可以实现参数引用

2、Environment 类

  • 从 @Value 的使用中可以发现,当参数很多时,使用起来就非常麻烦,要为每一个属性都加上 @Value。
  • 而使用 Environment 只需要调用一个 getProperty() 方法,就可以获取到配置参数。
  • Environment 是 Spring 提供的,直接 @Autowired 注入即可。

(1)Controller 代码:

@Autowired
private Environment environment;@RequestMapping(value = "/testEnvironment")
@ResponseBody
public String testEnvironment() {for (int i = 0; i <= 2; ++ i) {System.out.println("address1 = " + environment.getProperty("address[" + i + "]"));}return "testEnvironment";
}

3、@ConfigurationProperties

使用这个注解,可以将配置文件中的对象,对应地注入到一个 POJO 对象中。

(1)编写 POJO 实体类

  • @Component:让 Spring 识别,将其作为一个 bean 加入 IOC 中;
  • @ConfigurationProperties(prefix = "person"):设置一个前缀,标识该 POJO 类的属性应该从 yml 的哪一个对象中获取值;
  • get 和 set 方法不要忘记了;
package com.demo.pojo;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String name;private Integer age;private String[] address;
}

(2)application.yml 文件:

(3)测试代码:

@Autowired
private Person person;@RequestMapping(value = "/testConfiguration")
@ResponseBody
public String testConfiguration() {System.out.println("name = " + person.getName());System.out.println("age = " + person.getAge());for (String s : person.getAddress()) {System.out.println("address = " + s);}return "testConfiguration";
}

(4)输出结果

(5)给 yml 添加提示功能

<!-- 配置 配置文件的处理器 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
  • 添加这个依赖后,我们在 yml 中写配置信息时,就可以得到提示。

4、读取配置文件的问题汇总

(1)username

或许有一个疑问,在上面 @Value 中的 yml 配置文件里,为什么写 myUser,而不是直接写个 user 呢?

  • 如果尝试过就知道,输出 user.name,得到的居然是个人操作系统当前的用户名。
  • 显然 user 作为了一个保留的关键字,因此当我们以后实际开发中,最好给 user 加上前缀。

像数据库连接池需要使用 username 时,就要考虑这个问题了:https://blog.csdn.net/weixin_48841931/article/details/126671315

(2) @ConfigurationProperties 前缀命名问题

  • prefix 的命名是由要求的。

https://blog.csdn.net/a2664181446/article/details/122581439

(3)@ConfigurationProperties 添加后,yml 还是没有提示

  • 首先尝试重新 Build 项目,根据报错信息进行 Googel。

其中一种原因是编码问题:https://blog.csdn.net/gaogzhen/article/details/107348314

五、Profile

1、为什么需要 profile

我们在开发 SpringBoot 应用时,通常同一套程序要经过好几个环节,会被安装到不同的环境。

不同环境(开发、联调、预发、正式等)所需的配置不同,如果每改变一个环境就更改配置不但麻烦(修改代码、重新构建)而且容易出错。

profile 的功能就是来进行动态配置切换的。

2、profile 的配置方式

(1)多 profile 文件方式(properties),也是多 yml 文件方式

(2)yml 多文档方式(不是多 yml 文件方式)

3、profile 激活方式之多 profile 文件

profile 的激活方式有三种:配置文件、虚拟机参数、命令行参数。

下面以 配置文件 为例子,说明 profile 激活。

(1)创建配置文件

配置各个环境下对应的 properties 配置文件,并为他们设置不同的服务器端口( server.port = xxxx)。各后缀意义如下:

  • develoment:表示开发环境;
  • product:表示生产环境;
  • test:表示测试环境;

(2)激活配置

当我们创建好这几个配置文件后,启动 SpringBoot,会发现服务器端口还是 8080。这是因为还没有激活任一配置。

  • 在 application.properties 中,使用 spring.profiles.active=后缀,就可激活指定的配置文件:

  • 为 development 设置端口为 8081: 

  • 启动 SpringBoot,此时端口已经改变: 

4、profile 激活方式之 yml 多文档

(1)创建配置文件

  • 只需要一个 application.yml 即可,在其中使用 --- 来区分不同的配置。
  • 每一个 --- 开头,表示一个新的配置区域。
  • spring.config.activate.on-profile 用来表示配置的名称,作用于前面的“后缀”类似。
  • 旧版本使用 spring.profiles 来表示配置名称。

(2)激活配置

  • 同样也是 spring.profiles.active 来激活指定配置。

(3)文件代码

---
server:port: 8081
spring:config:activate:on-profile: development
---
server:port: 8082
spring:config:activate:on-profile: product
---
server:port: 8083
spring:config:activate:on-profile: test
---
spring:profiles:active: development

(4)启动结果

  • 激活 development 配置,端口应为 8081。

5、虚拟机参数与命令行参数

(1)虚拟机参数

  • 在 VM 选项中,输入 -Dspring.profiles.active=后缀,即可激活对应配置。 

(2)命令行参数

  • 将我们当前的 SpringBoot 工程打包成 jar(可以使用 maven 的 package);
  • 在命令行窗口中,先 cd 到 jar 的目录下,然后运行命令:java  -jar  xxx.jar  --spring.profiles.active=development 即可;
  • application.properties 和 appliaction.yml 都可以通过这种方式修改 spring.profiles.active 的值;

6、激活 profile 问题汇总

(1)Demo-Profile-0.0.1-SNAPSHOT.jar中没有主清单属性

  • 请确保 pom.xml 中有一下内容:
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

7、项目内部配置文件加载顺序

六、SpringBoot 整合其他框架

1、整合 Junit

(1)引入依赖

  • 引入 SpringBoot 的起步依赖 test。
  • 引入 Junit。
<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>

(2)创建测试类(一个 Service)

(3)@RunWith 注解作用

@RunWith 就是一个运行器;

  • @RunWith(JUnit4.class)就是指用 JUnit4 来运行;
  • @RunWith(SpringJUnit4ClassRunner.class),让测试运行于 Spring 测试环境,以便在测试开始的时候自动创建 Spring 的应用上下文;
  • @RunWith(Suite.class)的话就是一套测试集合;

(4)@SpringBootTest(classes = 启动类名称.class)

基本等同于启动了整个服务,此时便可以开始功能测试。

  • 如果注解 @SpringBootTest(classes = 启动类名称.class) 中配置了项目启动类,则 test 测试类可以放在 test 下任何包中;

  • 如果注解 @SpringBootTest 没有配置参数 classes = Application.class,则需要确保 test 测试类,在启动类的同目录或者子目录下;(网上一堆说是包路径一致的,都是片面的)

2、整合 Redis

Redis5 安装:https://github.com/tporadowski/redis/releases

(1)引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(2)本机地址测试

  • 先不配置远程,使用本机测试。
  • 运行之前先启动 redis 本地服务器:redie-server.exe
package com.demo.demoredis;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class DemoRedisApplicationTests {@Autowired// 本机才不用配置端口等信息private RedisTemplate redisTemplate;@Testvoid contextLoads() {}@Testpublic void testSet() {redisTemplate.boundValueOps("name").set("wyt");}@Testpublic void testGet() {System.out.println(redisTemplate.boundValueOps("name").get());}}

(3)通过配置文件修改 ip 和 port

  • 修改 properties 或者 yml 都可以。 

3、整合 MyBatis(演示注解开发)

(1)引入 MyBatis 起步依赖、PostgreSQL 驱动依赖

  • MyBatis 起步依赖是由 MyBatis 官方编写的,Spring 没有提供;
  • 根据自己所用的数据库更改 SQL 驱动;
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version>
</dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope>
</dependency>

(2)建立相关表信息

(3)配置数据源

  • 在配置文件中配置数据源的四个参数:driver、url、username、password。

(4)注解开发

  • 注解开发则没有使用 Spring 配置文件,mapper 接口可以用 @Mapper 来识别
  • Spring 配置文件中用包扫描的方式将所有 mapper 都生成了 bean 对象,因此在这里用个 @Repository 来标识;
@Mapper
@Repository
public interface UserMapper {@Select("select * from \"MyUser\";")List<User> queryForAll();
}

(5)测试及其结果

@Test
public void test() {List<User> userList = userMapper.queryForAll();System.out.println(userList);
}

(6)注解开发小结

  • From:https://blog.csdn.net/weixin_43591980/article/details/110043008
  • 参考:https://blog.csdn.net/qq_40598321/article/details/117730759 

4、框架整合问题汇总

(1)是否必须添加 @RunWith 注解

其实不一定非要添加,主要看导入的 @Test 的包是哪一个:https://www.bmabk.com/index.php/post/121982.html

 

相关文章:

[Spring] SpringBoot2 简介(一)—— 基础配置

目录 一、SpringBoot 简介 1、Spring 的缺点 2、SpringBoot 功能 二、SpringBoot 入门案例 1、实现步骤 2、访问服务器 3、入门小结 4、Idea 快速构建 SpringBoot 工程 5、起步依赖无需版本号 6、主启动类的在项目中的位置&#xff08;*重要*&#xff09; 三、Sprin…...

【软考】计算机指令系统寻址的几种方式及其速度的比较

速度比较&#xff1a;立即>寄存器>直接> 间接 1. 立即寻址&#xff1a; 直接在指令中给出操作数 2. 寄存器寻址&#xff08;Register Addressing&#xff09;&#xff1a; 寄存器寻址是指操作数直接存储在寄存器中。指令中的地址字段指定要使用的寄存器编号&#…...

golang笔记17--编译调试go源码

golang笔记17--编译调试go源码 前置条件编译源码在 fmt 包中加自定义函数说明 当前go语言越来越流行了&#xff0c;各大厂商都有加大go工程师的需求&#xff0c;作为go语言的学习者&#xff0c;我们除了要了解如何使用go语言外&#xff0c;也有必要了解一下如何编译、调试go源码…...

DailyPractice.2023.10.22

文章目录 1.[39. 组合总和]2.[22. 括号生成]3.[79. 单词搜索]4.[131. 分割回文串] 1.[39. 组合总和] 39. 组合总和 class Solution { public: vector<vector<int>> res; vector<int> path;void dfs(vector<int>& candidates,int target,int star…...

Go学习第四章——程序流程控制

Go学习第四章——程序流程控制 1 分支结构1.1 单分支1.2 双分支1.3 多分支1.4 switch分支 2 循环结构2.1 for循环2.2 while和dowhile的实现2.3 经典案例——打印金字塔2.4 经典案例——打印九九乘法表 3 跳转控制语句3.1 break3.2 continue3.3 goto3.4 return 流程控制的作用&a…...

自然语言处理---Transformer机制详解之Decoder详解

1 Decoder端的输入解析 1.1 Decoder端的架构 Transformer原始论文中的Decoder模块是由N6个相同的Decoder Block堆叠而成&#xff0c;其中每一个Block是由3个子模块构成&#xff0c;分别是多头self-attention模块&#xff0c;Encoder-Decoder attention模块&#xff0c;前馈全…...

【读书笔记】《软技能》

句子摘抄&#xff1a; 软技能-代码之外的生存指南 “自强不息 孜孜不倦” 强调了坚持不懈、不断奋斗和追求进步的精神。无论遇到多少困难和挫折&#xff0c;都要坚持努力&#xff0c;不断提高自己&#xff0c;不知疲倦地追求目标。这句谚语鼓励人们积极进取&#xff0c;不轻言…...

视频怎么压缩?视频过大这样压缩变小

在日常生活中&#xff0c;我们常常会遇到需要压缩视频的情况&#xff0c;视频压缩不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以在保证质量的同时&#xff0c;满足不同的使用需求。那么&#xff0c;如何有效地压缩视频呢&#xff1f; 方法一&#xff1a;嗨…...

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合&#xff08;c&#xff09;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…...

julia 笔记:复合类型 struct

1 struct关键字 1.1 声明 struct关键字与复合类型一起引入&#xff0c;后跟一个字段名称的块&#xff0c;可选择使用 :: 运算符注释类型 struct Foobarbaz::Intqux::Float64end 没有类型注释的字段默认为 Any 类型&#xff0c;所以可以包含任何类型的值。 1.2 创建新对象 …...

【JavaEE初阶】 线程池详解与实现

文章目录 &#x1f334;线程池的概念&#x1f384;标准库中的线程池&#x1f340;ThreadPoolExecutor 类&#x1f6a9;corePoolSize与maximumPoolSize&#x1f6a9;keepAliveTime&#x1f6a9;ThreadFactory&#x1f6a9;workQueue&#x1f6a9;RejectedExecutionHandler handl…...

web:[极客大挑战 2019]HardSQL

题目 打开页面显示为 查看源代码没有发现其他的提示信息&#xff0c;随便尝试一下 错误 题目名为hardsql&#xff0c;先来尝试有无sql注入存在 尝试输入单引号输入 显示页面存在注入 这里按照常规思路继续使用order by函数和union select函数进行查询&#xff0c;但是页面没有…...

Android apkanalyzer简介

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、用法3.1 使用 Android Studio3.1.1…...

PJSIP 2.7.2对G.729的支持,编译bcg729步骤

PJSIP 2.7.2对G.729的支持&#xff0c;编译bcg729步骤 下载BCG729源码升级cmake编译BCG729编译pjsip2.7.2 pjsua测试 下载BCG729源码 git clone git://git.linphone.org/bcg729.git升级cmake 注&#xff1a;编译BCG729要求cmake版本大于3.0&#xff0c;如果版本已经达到要求&…...

(二)Python类型总结

Python 是一种面向对象的语言。这意味着在 Python 中&#xff0c;一切都是对象&#xff0c;包括变量、函数和模块。Python 支持类和对象的概念&#xff0c;通过定义类来创建对象&#xff0c;并使用对象的方法和属性来操作数据。 Python 与 Java 和 C 在数据类型方面有一些相似…...

pojo之vo_dto_po的一些理解

一次扫盲VO、DTO、DO和PO区别、用法、概念~-腾讯云开发者社区-腾讯云 (tencent.com) Java学习笔记——实体类&#xff08;ENTITY&#xff0c;VO&#xff0c;DTO&#xff0c;BO&#xff09;_dto继承entity_路言汐的博客-CSDN博客 说清楚PO、DTO、VO、BO与使用场景_业务逻辑层p…...

Leetcode 第 364 场周赛题解

Leetcode 第 364 场周赛题解 Leetcode 第 364 场周赛题解题目1&#xff1a;2864. 最大二进制奇数思路代码复杂度分析 题目2&#xff1a;美丽塔 I思路代码复杂度分析 题目3&#xff1a;美丽塔 II思路代码复杂度分析 题目4&#xff1a;统计树中的合法路径数目思路代码复杂度分析 …...

简单单调栈的运用,悬线法---最大子矩阵,整除分块(规律+分块边界)

简单单调栈的运用 牛客一站到底 最优屏障 题意&#xff1a;有n座山&#xff0c;高度位ai,山上的士兵能相互监督当且仅当max(ai1...aj-1)<min(ai,aj) M国的防守能力大小为相互监视的哨兵对数,H国家可以放一块巨大屏障在某山前&#xff0c;以便最大消弱M方式能力 计算最优的屏…...

华为OD 数组求和(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...