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

Spring Boot知识点详解

打包部署

<!‐‐ 这个插件,可以将应用打包成一个可执行的jar包;‐‐> 
<build><plugins> <plugin> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐maven‐plugin</artifactId></plugin></plugins> 
</build>

将这个应用打成jar包,直接使用java -jar的命令进行执行;

POM文件(父项目

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐parent</artifactId> <version>1.5.9.RELEASE</version> 
</parent> <!--他的父项目是-->
<parent> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐dependencies</artifactId> <version>1.5.9.RELEASE</version> <relativePath>../../spring‐boot‐dependencies</relativePath>
</parent> 
<!--他来真正管理Spring Boot应用里面的所有依赖版本-->

Spring Boot的版本仲裁中心;

以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)

启动器【starter】

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

**spring-boot-starter-web: **

spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;

里面所包含的依赖:

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter,相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器 。

主程序类(入口)

//@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
@SpringBootApplication
public class HystrixApplication {public static void main(String[] args) {// Spring应用启动起来SpringApplication.run(HystrixApplication.class, args);}
}

@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
1、@SpringBootConfifiguration

@SpringBootConfifiguration:Spring Boot的配置类; 标注在某个类上,表示这是一个Spring Boot的配置类;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

@Confifiguration:配置类上来标注这个注解; 配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component 。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Configuration {
}
2、EnableAutoConfiguration

@EnableAutoConfiguration:开启自动配置功能;

以前我们需要配置的东西,现在Spring Boot帮我们自动配置;@EnableAutoConfifiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效;

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

  • @AutoConfifigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}

@Import(AutoConfifigurationPackages.Registrar.class):

Spring的底层注解@Import,给容器中导入一个组件;导入的组件AutoConfifigurationPackages.Registrar.class;

扫描启动类下所在的包,以及下面的子包。

将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;

  • @Import(EnableAutoConfigurationImportSelector.class); 给容器中导入组件?

EnableAutoConfigurationImportSelector:导入哪些组件的选择器;

将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;

会给容器中导入非常多的自动配置类(xxxAutoConfifiguration);就是给容器中导入这个场景需要的所有组件, 并配置好这些组件;

有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;

Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获EnableAutoConfifiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;

以前我们需要自己配置的东 西,自动配置类都帮我们;

J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfifigure-1.5.9.RELEASE.jar;

YAML

1、基本语法

k:(空格)v:表示一对键值对(空格必须有);

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

属性和值也是大小写敏感;

2、值的写法
  • **字面量:普通的值(数字,字符串,布尔) **

k: v:字面直接来写;

字符串默认不用加上单引号或者双引号;

“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi

user:diy:name: "zhangsan \n lisi"

‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

user:diy:name: 'zhangsan \n lisi'

  • **对象、Map(属性和值)(键值对): **

k: v:在下一行来写对象的属性和值的关系;注意缩进

对象还是k: v的方式

myuser:friends:lastName: zhangsanage: 20

行内写法:

myuser:friends: {lastName: zhangsan,age: 20}
  • 数组(ListSet

用- 值表示数组中的一个元素

pets: ‐ cat‐ dog‐ pig

行内写法

pets: [cat,dog,pig]
person.last-name-张三
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.1ists=a,b,c 
person.dog.name=dog 
person.dog.age=15
3、配置文件值注入

配置文件

person:lastName: helloage: 18boss: falsebirth: 2017/12/12maps: {k1: v1,k2: 12}lists:- cat- pigdog:name: 小狗age: 12

JavaBean

/**
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射 
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; 
*/
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class MyPerson {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String,Object> maps;private List<Object> lists;private Dog dog;
}

导入配置文件处理器,以后编写配置就有提示了

<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

properties配置文件在idea中默认utf-8****可能会乱码

4、@Value获取值和@ConfifigurationProperties获取值比较
@ConfifigurationProperties@Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持不支持
SpEL不支持支持
JSR303数据校验 支持不支持
复杂类型封装 支持不支持

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfifigurationProperties;

5、@PropertySource&@ImportResource&@Bean

@PropertySource:加载指定的配置文件;

@Data
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person1")
public class MyUser {private String name;private String address;
}

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

@ImportResource(locations = {"classpath:beans.xml"}) 
//导入Spring的配置文件让其生效

Profifile

1、多Profifile文件

我们在主配置文件编写的时候,文件名可以是 application-{profifile}.properties/yml

默认使用application.properties的配置;

2、yml支持多文档块方式
server: port: 8081 
spring: profiles: active: prod   #指定属于哪个环境
‐‐‐ 
server: port: 8083 
spring: profiles: dev
---  
server: port: 8084 
spring:profiles: prod   
3、激活指定profifile

1、在配置文件中指定

spring.profifiles.active=dev

2、命令行:

java -jar upload-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

可以直接在测试的时候,配置传入命令行参数

3、虚拟机参数;

-Dspring.profifiles.active=dev

配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文

–fifile:./confifig/

–fifile:./

–classpath:/confifig/

–classpath:/

优先级由高到底,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部加载主配置文件;互补配置

我们还可以通过spring.confifig.location来改变默认的配置文件位置

**项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置; **

java -jar webupload.jar --spring.confifig.location=G:/application.properties

外部配置加载顺序

SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会 形成互补配置****。

1.命令行参数

所有的配置都可以在命令行上进行指定

java -jar webupload.jar --server.port=8087 --server.context-path=/abc

多个配置用空格分开; --配置项=值

2.来自java:comp/env的JNDI属性

3.Java系统属性(System.getProperties())

4.操作系统环境变量

5.RandomValuePropertySource配置的random.*属性值

**由jar包外向jar包内进行寻找; **

**优先加载带profifile **

**6.jar包外部的application-{profifile}.properties或application.yml(带spring.profifile)配置文件 **

**7.jar包内部的application-{profifile}.properties或application.yml(带spring.profifile)配置文件 **

**再来加载不带profifile **

**8.jar包外部的application.properties或application.yml(不带spring.profifile)配置文件 **

**9.jar包内部的application.properties或application.yml(不带spring.profifile)配置文件 **


10.@Confifiguration注解类上的@PropertySource

11.通过SpringApplication.setDefaultProperties指定的默认属性

静态资源的映射规则

1)所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;

2)“/**” 访问当前项目的任何资源,都去(静态资源的文件夹)找映射

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };

3)欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;

localhost:8080/         找index页面

4)所有的 **/favicon.ico 都是在静态资源文件下找;

配置嵌入式Servlet容器

SpringBoot默认使用Tomcat作为嵌入式的Servlet容器;

如何定制和修改Servlet容器的相关配置** **

  • 修改和server有关的配置(ServerProperties【也是EmbeddedServletContainerCustomizer】)
server.port=8081 
server.context‐path=/crud 
server.tomcat.uri‐encoding=UTF‐8 /
/通用的Servlet容器设置 
server.xxx 
//Tomcat的设置 
server.tomcat.xxx
  • 编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置
@Configuration
public class TomcatConfig {@Beanpublic WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer(){return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {@Overridepublic void customize(ConfigurableServletWebServerFactory factory) {factory.setPort(8888);}};}
}

注册Servlet三大组件【Servlet、Filter、Listener】

public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("hello");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("hello");}
}public class MyListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("contextInitialized应用启动....");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("contextInitialized应用销毁");}}public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("filter");chain.doFilter(request,response);}@Overridepublic void destroy() {}
}

注册ServletRegistrationBean 、FilterRegistrationBean 、ServletListenerRegistrationBean

@Configuration
public class MvcConfig {//注册三大组件之Servlet@Beanpublic ServletRegistrationBean myServlet() {ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");return servletRegistrationBean;}//注册三大组件之Filter@Beanpublic FilterRegistrationBean myFilter() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new MyFilter());//拦截指定的接口filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));return filterRegistrationBean;}//注册三大组件之Listener@Beanpublic ServletListenerRegistrationBean myListener() {ServletListenerRegistrationBean<MyListener> myListenerServletListenerRegistrationBean = new ServletListenerRegistrationBean<>(new MyListener());myListenerServletListenerRegistrationBean.setOrder(1);return myListenerServletListenerRegistrationBean;}
}

相关文章:

Spring Boot知识点详解

打包部署 <!‐‐ 这个插件&#xff0c;可以将应用打包成一个可执行的jar包&#xff1b;‐‐> <build><plugins> <plugin> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐maven‐plugin</artifactId&g…...

基于 EFISH-SBC-RK3588 的无人机多光谱/红外热成像边缘计算方案

一、硬件架构设计‌ ‌核心算力平台&#xff08;EFISH-SBC-RK3588&#xff09;‌ ‌处理器性能‌&#xff1a;搭载 8 核 ARM 架构&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 与 Mali-G610 GPU&#xff0c;支持多光谱图像实时融…...

字典与集合——测试界的黑话宝典与BUG追捕术

主题&#xff1a;“字典是测试工程师的暗号手册&#xff0c;集合是BUG的照妖镜” 一、今日目标 ✅ 掌握字典的「键值对暗号体系」与集合的「去重妖法」✅ 开发《测试工程师黑话词典》&#xff0c;让新人秒变老司机✅ 统计自动化测试结果中的高频BUG类型&#xff08;附赠甩锅指…...

QT构建即时通讯应用--WebSocket全面解析与实战指南

概述 WebSocket协议因其低延迟和双向通信的能力而成为了现代Web和桌面应用程序的首选,Qt框架提供了强大的WebSocket支持,使得开发者可以轻松地集成这一技术到自己的项目中 WebSocket简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许服务器主动向客户端推…...

复杂性决策-思维训练

思维训练 1.模式识别 观察、复杂、不确定、波动、模糊 –找出必要和非必要因素 –识别重大威胁和机遇 2.系统分析 为复杂情景构建系统心智模型 利用模型识别模式做出预测&#xff0c;指定有效策略 3.心智敏锐度 利用不同层次的分析探索挑战的能力&#xff0c;对其他利益相关方在…...

缓存集群技术深度解析:从原理到实战

缓存集群技术深度解析&#xff1a;从原理到实战 一、缓存集群核心定位与架构选型 1. 集群模式核心价值 缓存集群通过数据分片、高可用保障、水平扩展解决单节点瓶颈&#xff0c;核心能力包括&#xff1a; 数据分片&#xff1a;将数据分散到多个节点&#xff0c;突破单节点内…...

Qt C++/Go/Python 面试题(持续更新)

目录 1、封装、继承、多态是什么&#xff1f; 2、final标识符的作用是什么&#xff1f; 3、介绍一下虚函数 4、介绍一下智能指针 5、介绍一下左值、右值、左值引用、右值引用 6、指针和引用有什么区别&#xff1f; 7、define和const的区别是什么&#xff1f; 8、C程序的…...

Spring Cloud Alibaba VS Spring Cloud

​​Spring Cloud Alibaba 与 Spring Cloud 组件对比​ ​​服务发现与注册中心​ 功能​​​Spring Cloud​​​Spring Cloud Alibaba​对比说明​​核心组件​EurekaNacosNacos 支持动态配置管理、健康检查更灵活&#xff0c;且提供 DNS 服务发现能力。​​​​健康检查​​…...

containerd 配置代理

1.systemd unit file 为 containerd 服务创建一个 systemd 插入目录 mkdir /etc/systemd/system/containerd.service.d/创建名为 /etc/systemd/system/containerd.service.d/http-proxy.conf 的文件 添加 HTTP_PROXY 环境变量 [Service] Environment"HTTP_PROXYhttp:/…...

专家系统的基本概念解析——基于《人工智能原理与方法》的深度拓展

一、什么是专家系统 &#xff08;一&#xff09;基本思想与定义 1. 核心思想&#xff1a;知识与推理的分离 迄今为止&#xff0c;关于专家系统还没有一个公认的严格定义&#xff0c;一般认为&#xff1a; &#xff08;1&#xff09;它是一个智能程序系统&#xff1b; &…...

什么是公链?公链项目有哪些?公链项目开发

公链技术全景解析&#xff1a;定义、生态与开发指南&#xff08;2025年深度版&#xff09; 一、公链的本质与核心特征 1.1 公链的定义 公链&#xff08;Public Blockchain&#xff09;是一种完全开放、无需许可的区块链网络架构&#xff0c;其核心特征在于去中心化、透明…...

如何解析商品详情页面

解析商品详情页面是爬虫开发中的一个重要环节。由于商品详情页面通常包含丰富的信息&#xff0c;如商品名称、价格、描述、图片等&#xff0c;因此需要仔细分析页面结构并提取所需数据。以下是一个详细的步骤指南&#xff0c;展示如何使用 Java 和 Jsoup 解析商品详情页面。 一…...

Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案

整个应用&#xff08;包括 View 和 Compose 部分&#xff09;的浅色/深色模式保持一致。以下是完整的解决方案&#xff1a; 全局配置方案 1. 基础主题设置 在 res/values/themes.xml 和 res/values-night/themes.xml 中定义统一的主题&#xff1a; <!-- values/themes.x…...

三国杀专业分析面板,立志成为桌游界的stockfish

三国杀专业分析面板 (SGSFish) GitHub仓库&#xff1a; 本项目是一个基于 Python 实现的三国杀专业分析面板&#xff0c;旨在模拟玩家决策过程&#xff0c;通过量化评估动作实体&#xff08;卡牌/技能&#xff09;的价值、考虑它们之间的相互影响&#xff08;包括基于作用域的…...

解析 select 函数

解析 select 函数 select 函数是 Unix/Linux 系统中用于多路复用的系统调用&#xff0c;主要用于在多个文件描述符&#xff08;file descriptors&#xff09;上等待事件的发生。它允许程序同时监视多个 I/O 通道&#xff0c;并在任意一个通道准备好进行 I/O 操作时通知程序&am…...

对话模型和补全模型区别

对话模型和补全模型区别 什么是对话模型、补全模型 什么是 Completion 最基本地说,文本模型是一个经过训练的大型数学模型,旨在完成一项单一任务:预测下一个 token 或字符。这个过程被称为 completion,在您的旅程中您会经常遇到这个术语。 例如,当使用 completion 文本…...

计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形

以下是使用Qt和OpenGL实现绘制彩色三角形并添加颜色选择按钮的步骤&#xff1a; 一、创建OpenGL绘制组件 继承QOpenGLWidget实现自定义绘制类&#xff1a; // myopenglwidget.h #include <QOpenGLWidget> #include <QOpenGLFunctions_3_3_Core> #include <QO…...

十分钟应急响应——自定义工具链整合实战

核心思路 结合群联AI云防护的API和自定义脚本&#xff0c;实现攻击检测、节点切换、日志分析的端到端自动化。 技术实现步骤 1. 实时攻击检测脚本 使用Python监听群联系统日志&#xff0c;识别攻击特征&#xff1a; # monitor_attack.py import json import subprocess from…...

SpringCloud微服务架构设计与实践 - 面试实战

SpringCloud微服务架构设计与实践 - 面试实战 第一轮提问 面试官&#xff1a;马架构&#xff0c;请问在SpringCloud微服务架构中&#xff0c;如何实现服务注册与发现&#xff1f; 马架构&#xff1a;在SpringCloud中&#xff0c;Eureka是常用的服务注册与发现组件。服务提供…...

每日算法——快乐数、两数之和

202. 快乐数 class Solution { public:bool isHappy(int n) {unordered_set<int> result_set;while(true){int sum 0;while(n>0){sum (n%10)*(n%10);n/10;}if(sum1){return true;}else{if(result_set.find(sum) ! result_set.end()){return false;}result_set.inser…...

反射,枚举,lambda表达式

目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用&#xff1a;在Java代码中&#xff0c;让一个对象认识到自己 比如一个类的名字&#xff0c;里面的方法&#xff0c;属性等 让程序运行的过程&#xff0c;某个对…...

matlab 绘图

1.三维绘图 % 原始数据&#xff08;按行输入&#xff1a;x y z&#xff09; data [1 2 3 ;5 56 234 ;32 34 67 1 2 5 ];% 提取坐标并生成网格&#xff08;适用于surf函数的网格格式&#xff09; x data(:,1); % X坐标&#xff08;行数对应Y轴&#xff09; y data…...

AI日报 - 2025年04月25日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; AGI突破 | OpenAI o3模型展现行动能力&#xff0c;英国发布RepliBench评估AI自主复制风险&#xff0c;DeepMind CEO担忧AGI协调挑战。 模型能力向行动和自主性演进&#xff0c;安全与协调成为焦点。 ▎&#x1f4bc; 商业动向…...

力扣面试150题--基本计算器

Day 31 题目描述 思路 &#xff08;逆波兰表达式扩展&#xff09; 初次思路&#xff1a;此题我遇到了几个难点 如何处理&#xff08;&#xff09;如何处理-1和2-1中的负数还是减法问题 1-&#xff08;-&#xff08;12&#xff09;&#xff09;如何处理多余的空格 我的做法如…...

各种各样的bug合集

一、连不上数据库db 1.可能是密码一大包东西不对&#xff1b; 2.可能是里面某个port和数据库不一样&#xff08;针对于修改了数据库但是连不上的情况&#xff09;&#xff1b; 3.可能是git代码没拉对&#xff0c;再拉一下代码。❤ 二、没有这个包 可能是可以#注释掉。❤ …...

【25软考网工】第三章(3)虚拟局域网VLAN

一、虚拟局域网VLAN 1. VLAN基础 定义&#xff1a;根据管理功能、组织机构或应用类型对交换局域网进行分段而形成的逻辑网络。例如将大型网络划分为多个VLAN&#xff08;如VLAN1-4&#xff09;。 优势&#xff1a; 管理便利&#xff1a;便于对不同部门或功能进行分组管理安全隔…...

SFINAE(Substitution Failure Is Not An Error)

C 中的 SFINAE&#xff08;替换失败并非错误&#xff09; SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;是 C 模板元编程的核心机制之一&#xff0c;允许在编译时根据类型特性选择不同的模板实现。以下通过代码示例和底层原理&#xff0c;逐步解析 SFI…...

学习记录:DAY17

我的学习日志&#xff1a;前端开发练习 前言 只想畏缩在自己的床上&#xff0c;什么也不想干&#x1f630; 我觉得有必要调整一下复习方针&#xff0c;不然容易白学。 我确实不太爱复习的人&#xff0c;尽量每天抽出时间来复习昨天的内容&#xff0c;周末总体复习一下一个星期…...

LibrePhotos本地部署打造个人云相册安全存储和分享家庭照片(1)

文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 手机里塞满了珍贵回忆&#xff0c;却担心一不小心就被偷看&#xff1f;别怕&#xff0c;今天我就教你一个绝招——使用LibrePho…...

Android插拔U盘导致黑屏问题排查

问题现象&#xff1a; 车机大屏偶先插拔带音乐的U盘&#xff0c;导致车机系统短暂黑屏的情况。 日志中可以看到vold进程unmount了两次分区&#xff0c;一次是U盘分区&#xff0c;一次是/storage/emulated/0分区&#xff1a; I vold : Start killProcesses: /mnt/media_rw/…...

Android Build Variants(构建变体)详解

Android Build Variants&#xff08;构建变体&#xff09;是 Android 开发中用于生成不同版本应用程序的一种机制。它允许开发者根据不同的需求&#xff0c;如不同的应用市场、不同的功能模块、不同的环境配置等&#xff0c;从同一个代码库中生成多个不同的 APK。 组成部分 B…...

看一看 中间件Middleware

中间件&#xff08;Middleware&#xff09;是介于操作系统与应用程序之间的一层软件 它为分布式应用程序提供了统一的通信、数据交换、服务调用、消息传递等能力。 它的作用就像“胶水”&#xff0c;连接各个系统组件。 文章目录 消息队列缓存中间件数据库中间件服务注册与发现…...

ai人才需要掌握什么

在人工智能(AI)技术重塑全球产业格局的今天,AI人才的核心竞争力已超越单一技术维度,演变为“技术深度+人文广度+伦理自觉”的三维能力模型。本文将从技术能力体系、跨学科思维、伦理与治理三个层面,解析AI人才的核心能力框架,并针对技术局限性提出系统性应对策略。 一、…...

‌RISC-V低功耗MCU动态时钟门控技术详解

我来分享一下RISC-V核低功耗MCU的动态时钟门控技术实现&#xff1a; 这款MCU通过硬件级时钟门控电路实现了模块级的功耗管理。当外设&#xff08;如UART、SPI&#xff09;处于闲置状态时&#xff0c;系统会自动切断其时钟信号&#xff0c;减少无效翻转功耗。同时支持多电压域协…...

第十天 Shader编程:编写简单表面着色器 Addressable资源管理系统 DOTS(面向数据技术栈)入门

前言 作为Unity初学者&#xff0c;在实现复杂场景时经常会遇到性能瓶颈。本文将带你通过四个关键技术的实战学习&#xff0c;掌握现代Unity开发的核心优化方案&#xff1a; Shader编程 - 编写表面着色器控制物体渲染Addressable系统 - 实现高效资源管理DOTS技术栈 - 解锁百万…...

把dll模块注入到游戏进程的方法_插APC注入

一、概述 APC是异步过程调用,系统创建线程的时候会为线程创建一个APC队列,当线程调用SleepEx,WaitSingleObjectEx等函数时,并把线程状态被设置为可提醒状态时,线程并不会睡眠,而是检查APC队列是否为空,如果不为空,转去执行APC队列中的每一项,因此给目标进程中的线程插…...

【C++】内存管理:内存划分、动态内存管理(new、delete用法)

文章目录 一、C/C中的内存划分二、C语言中动态内存管理方式三、C中动态内存管理方式1、new、delete基本用法(1)、内置类型(2)、自定义类型 2、operator new与operator delete函数3、new和delete的实现原理&#xff08;1&#xff09;内置类型&#xff08;2&#xff09;自定义类型…...

【k8s】KubeProxy 的三种工作模式——Userspace、iptables 、 IPVS

在 Kubernetes 集群中&#xff0c;KubeProxy 是实现 Service 的网络代理和负载均衡功能的关键组件。它支持三种工作模式&#xff1a;Userspace 模式、iptables 模式和 IPVS 模式。每种模式都有其特点和适用场景&#xff0c;以下是详细介绍&#xff1a; Userspace 模式 工作原…...

密码学的hash函数,哈希碰撞, collision resistance, BTC用到的SHA-256简介

密码学中的哈希函数、哈希碰撞、抗碰撞性&#xff08;collision resistance&#xff09;以及比特币中使用的 SHA-256 的简明介绍&#xff1a; &#x1f9e9; 一、哈希函数&#xff08;Hash Function&#xff09; 定义&#xff1a; 哈希函数是一种将任意长度的输入&#xff08;…...

通过监督微调(SFT)提升AI Agent效果的完整指南

一、SFT技术深度剖析 1.1 核心概念 监督微调&#xff08;Supervised Fine-Tuning&#xff09;是在大规模预训练语言模型&#xff08;如LLaMA、GPT系列&#xff09;的基础上&#xff0c;使用特定任务标注数据进行二次训练的过程。其本质是通过有监督学习调整模型参数&#xff…...

TCP基础题:音乐播放列表管理系统

需求描述 服务器端 创建一个 TCP 服务器&#xff0c;监听本地的 9999 端口&#xff0c;支持多个客户端连接。维护一个音乐播放列表&#xff0c;每个音乐条目包含歌曲名称、歌手、时长等信息。能够处理客户端的以下请求&#xff1a; 添加音乐到播放列表&#xff1a;接收客户端发…...

碰一碰发视频源码文案功能,支持OEM

在数字化营销与内容传播领域&#xff0c;碰一碰发视频文案功能凭借 NFC 技术的便捷性&#xff0c;实现了视频与文案的快速传递。本文将围绕该功能的开发流程&#xff0c;从需求分析、技术架构设计到核心功能实现&#xff0c;详细解析其开发要点&#xff0c;为开发者提供实践参考…...

如何在 Vue 3 中实现一个自定义的 `v-html` 组件

引言 在 Vue.js 中&#xff0c;v-html 是一个非常有用的指令&#xff0c;用于将 HTML 字符串渲染到元素中。然而&#xff0c;由于它直接插入 HTML 内容&#xff0c;存在潜在的安全风险&#xff08;如 XSS 攻击&#xff09;。因此&#xff0c;了解其工作原理并实现一个安全的替…...

差分对的返回电流-信号完整性分析

差分对的返回电流: 单端线的返回电流集中在参考平面&#xff0c;差分对的返回电流是怎样分布的?有一种观点认为&#xff0c;对于差分对这种耦合传输结构&#xff0c;其中一条走线是另一条走线的返回路径。甚至更进一步得出差分对不需要参考平面的结论。是否真的如此?要想了解…...

html单页业务介绍源码

源码介绍 html单页业务介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行 效果预览 源码免费获取 html单页业务介绍源码...

IDEA导入并启动若依项目步骤(SpringBoot+Vue3)

1.下载后端项目 项目地址&#xff1a;https://gitee.com/y_project/RuoYi-Vue 复制命令&#xff0c;将项目克隆到本地 git clone gitgitee.com:y_project/RuoYi-Vue.git使用IDEA打开&#xff08;会有点慢&#xff0c;耐心等待&#xff09;&#xff0c;打开后如下 2.Mysql导…...

零基础上手Python数据分析 (22)案例实战]之利用 Matplotlib Seaborn 进行电商销售数据可视化分析

写在前面 —— 图表为刃,洞察先行!综合运用 Pandas、Matplotlib 与 Seaborn,点亮数据价值 本篇通过一个完整的案例实战,体验如何将数据分析与数据可视化紧密结合,让冰冷的数据转化为生动、直观、富有洞察力的视觉故事! 案例目标: 本篇博客将延续我们在第 17 篇案例中…...

图像预处理-霍夫变换

一.概念 霍夫变换是图像处理的一种技术&#xff0c;主要用于检测图像中的直线、圆等几何形状。基本思想就是将图像空间&#xff08;直角坐标系或极坐标系&#xff09;中的点映射到(霍夫空间)参数空间中&#xff0c;通过在参数空间中寻找累计最大值实现对特定形状的检测。 接下…...

逐步了解蓝牙 LE 配对(物联网网络安全)

配对是蓝牙 LE 中的一个重要概念。让我们来了解一下蓝牙 LE 配对的基础知识,概述 LE 设备如何在可信设备之间安全地共享密钥。 在之前的一篇文章]中,我们讨论了蓝牙 LE 的安全密钥。我们了解到,蓝牙 LE 设备可以创建并共享三个不同的安全密钥:一个用于数据加密,一个用于创…...

嵌入模型(Embedding Models)原理详解:从Word2Vec到BERT的技术演进

一、什么是嵌入模型&#xff1f; 嵌入模型&#xff08;Embedding Models&#xff09; 是一种将高维离散数据&#xff08;如文本、图像&#xff09;转换为低维连续向量表示的技术。这些向量能够反映数据的语义关系&#xff0c;使得“语义相近的实体在向量空间中距离更近”。例如…...