Spring MVC常见注解详解
Spring MVC提供了丰富的注解,以简化Web应用开发过程。下面我将详细描述一些主要的注解、它们的作用、应用场景以及具体的应用示例。
1. @Controller
- 作用: 标记一个类作为Spring MVC的控制器组件。这个注解是定义处理HTTP请求的入口点。
- 标识控制器组件:
@Controller
注解用来标记一个Java类为Spring容器中的一个Bean,并且这个Bean主要用于处理HTTP请求。 - 支持自动扫描: 当配置了组件扫描(例如通过
<context:component-scan>
)时,Spring会自动发现并注册这些被@Controller
标注的类为Spring Bean。
- 标识控制器组件:
- 应用场景:
- Web层开发: 主要用于构建Web应用的控制层,负责处理客户端发来的请求,调用业务逻辑层的方法,并返回相应的视图或数据给客户端。
- MVC架构中的C部分: 在Model-View-Controller (MVC)设计模式中,
@Controller
代表控制器(Controller),负责接收用户请求,处理业务逻辑,并指定响应结果。
- 示例:
以下是一个简单的例子,展示了如何使用
@Controller
来创建一个基本的Spring MVC控制器:import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;@Controller public class HelloController {// 映射URL到特定的处理器方法@RequestMapping("/hello")public String hello() {// 返回逻辑视图名称,视图解析器会根据这个名称找到具体的视图页面return "hello";} }
2. @RestController
- 作用: 组合了
@Controller
和@ResponseBody
的功能,适用于构建RESTful Web服务。- 标识REST控制器:
@RestController
注解用来标记一个Java类作为处理REST请求的控制器。它结合了@Controller
和@ResponseBody
注解的功能,意味着在这个控制器里的每个方法都会直接返回响应体,而不是视图名称。 - 支持自动扫描: 类似于
@Controller
, 当配置了组件扫描时,Spring会自动发现并注册这些被@RestController
标记的类为Spring Bean。
- 标识REST控制器:
- 特点:
- 简化开发: 使用
@RestController
可以避免在每个处理方法上都添加@ResponseBody
注解,简化了代码。 - 默认返回JSON/XML: 该注解下的方法通常返回的是数据而非视图,因此非常适合用于构建RESTful API。返回的数据一般会被转换成JSON或XML格式(取决于客户端接受的内容类型和配置)。
- 简化开发: 使用
- 应用场景: 在需要直接返回响应体(如JSON或XML)而不是视图名称时使用。
- 示例:
下面是一个简单的例子,展示了如何使用
@RestController
创建一个基本的RESTful API:import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;@RestController public class GreetingController {// 映射GET请求到特定的处理器方法@GetMapping("/greeting")public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {return String.format("Hello, %s!", name);} }
在这个例子中,当用户访问
/greeting
URL时(例如:/greeting?name=Spring
),GreetingController
中的greeting()
方法会被调用,它接收一个名为name
的查询参数,并返回一个字符串形式的问候消息。如果未提供name
参数,则使用默认值 "World"。
3. @RequestMapping
-
作用:
- URL映射: 主要用于映射HTTP请求到控制器的方法上。可以指定HTTP请求的URL、HTTP方法(GET, POST等)、请求参数、头部信息等。
- 支持多种HTTP方法: 可以用来处理GET、POST、PUT、DELETE等多种类型的HTTP请求。
- 属性:
- value / path: 定义请求路径或路径模式,如
/home
,/user/{id}
。 - method: 指定HTTP请求方法类型,比如
RequestMethod.GET
,RequestMethod.POST
。 - params: 通过请求参数来缩小匹配范围,例如
params = "action=update"
表示只有当请求中包含特定参数时才匹配。 - headers: 根据请求头信息来限制映射,例如
headers = "content-type=text/plain"
。 - produces / consumes: 指定媒体类型来限制映射,适用于RESTful服务,
produces
用于响应内容类型,consumes
用于请求内容类型。
- value / path: 定义请求路径或路径模式,如
-
示例:
以下是一些具体的使用示例,帮助理解@RequestMapping
的不同用法: - 基本映射
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@RequestMapping("/hello")public String hello() {return "Hello, World!";}
}
此代码段展示了最基本的用法,访问 /hello
URL时返回字符串 "Hello, World!"。
- 指定HTTP方法
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@RequestMapping(value = "/users", method = RequestMethod.GET)public String getUserList() {return "User list";}
}
这里仅当收到对 /users
的GET请求时,才会调用 getUserList()
方法。
- 路径变量
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class BookController {@RequestMapping("/books/{bookId}")public String getBook(@PathVariable("bookId") String bookId) {return "Details for book id: " + bookId;}
}
这个例子演示了如何从URL中提取变量(如 {bookId}
)并将其作为参数传递给处理方法。
- 请求参数
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SearchController {@RequestMapping("/search")public String search(@RequestParam(value = "query", defaultValue = "spring") String query) {return "You searched for: " + query;}
}
该示例展示了如何获取和使用查询参数,如果未提供 query
参数,则默认值为 "spring"
。
4. @GetMapping & @PostMapping
它们分别用于处理HTTP GET和POST请求。这两个注解实际上是 @RequestMapping
的特例,提供了更加简洁、直观的方式来指定需要处理的HTTP方法类型。下面我将详细介绍这两个注解,并提供一些代码示例帮助理解。
@GetMapping
@GetMapping
注解是一个组合注解,它等同于 @RequestMapping(method = RequestMethod.GET)
。这意味着它专门用于处理HTTP GET请求,即当用户尝试从服务器获取资源时所使用的请求类型。
示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello, welcome to the application!";}
}
在这个例子中,每当客户端向 /hello
发送GET请求时,sayHello()
方法就会被调用,并返回欢迎信息。
@PostMapping
类似地,@PostMapping
也是一个组合注解,它等价于 @RequestMapping(method = RequestMethod.POST)
。这个注解用于处理HTTP POST请求,通常用来处理客户端提交的数据,比如表单提交或通过API发送的数据。
示例:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DataController {@PostMapping("/submit")public String handleSubmit(@RequestParam("name") String name) {return "Received data: Name is " + name;}
}
在上面的例子中,如果客户端向 /submit
路径发送一个POST请求,并且请求参数中包含名为 name
的参数,则 handleSubmit()
方法会被调用,并返回接收的数据信息。
结合使用
有时你可能需要同时处理GET和POST请求,或者根据不同的条件执行不同的逻辑。这时可以结合使用 @GetMapping
和 @PostMapping
来分别处理不同类型的请求。
示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MultiRequestController {@GetMapping("/data")public String getData() {return "This is data from a GET request.";}@PostMapping("/data")public String postData(@RequestParam("content") String content) {return "Received via POST: " + content;}
}
在这个例子中,/data
路径既可以接受GET请求也可以接受POST请求,但是会根据请求的类型执行不同的方法。
5. @PathVariable
- 作用: 获取URL中的占位符参数值。
- 用于从URL中提取路径变量。它通常与
@RequestMapping
(或其特化形式如@GetMapping
,@PostMapping
等)一起使用,以实现RESTful风格的Web服务。通过@PathVariable
,你可以将URL的一部分绑定到处理器方法的参数上,使得URL不仅仅是一个静态地址,而是可以包含动态数据。
- 用于从URL中提取路径变量。它通常与
- 应用场景: REST风格的URL设计中获取动态部分
示例:
下面是如何使用 @PathVariable
注解的基本示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello/{name}")public String sayHello(@PathVariable String name) {return "Hello, " + name + "!";}
}
在这个例子中,当用户访问类似 /hello/John
的URL时,Spring会自动将 John
作为 name
参数传递给 sayHello()
方法,并返回 "Hello, John!"。
指定路径变量名
默认情况下,@PathVariable
绑定的参数名称需要与URL模板中的变量名称匹配。然而,如果你想要使用的参数名称与路径变量名称不同,可以通过指定 value
或 name
属性来明确指定要绑定的路径变量。
@GetMapping("/greet/{username}")
public String greetUser(@PathVariable("username") String user) {return "Greetings, " + user + "!";
}
在这个例子中,尽管方法参数名为 user
,但通过 @PathVariable("username")
明确指定了要绑定的是URL模板中的 {username}
变量。
路径变量的数据类型
除了字符串之外,路径变量还可以是其他数据类型,比如整数、浮点数等。Spring会尝试自动转换这些类型。
@GetMapping("/product/{id}")
public String getProductById(@PathVariable Long id) {// 假设这里有一些逻辑来根据ID查找产品return "Product ID: " + id;
}
如果提供的路径变量不能被转换为指定的数据类型(例如,提供了一个非数字的字符串作为ID),Spring会返回一个HTTP 400错误(Bad Request)。
多个路径变量
你也可以在同一个映射中使用多个路径变量:
@GetMapping("/order/{orderId}/item/{itemId}")
public String getOrderItem(@PathVariable Long orderId, @PathVariable Long itemId) {return "Order ID: " + orderId + ", Item ID: " + itemId;
}
这个例子展示了如何处理更复杂的URL结构,其中包含了两个不同的路径变量。
6. @RequestParam
- 作用: 绑定web请求参数到方法参数上。
- 属性介绍:
- value / name: 指定请求参数的名字,默认为变量名。
- required: 是否必须提供该参数,默认是
true
。如果设置为false
并且请求中没有提供此参数,则会使用默认值或者传入null
。 - defaultValue: 当请求中未提供该参数时使用的默认值。
- 应用场景: 获取请求参数值。
基本示例:
@GetMapping("/greet")
public String greetUser(@RequestParam("name") String name) {return "Hello, " + name;
}
如果用户访问 /greet?name=John
,则返回 "Hello, John"
。
-
指定默认值:
@GetMapping("/welcome") public String welcomeUser(@RequestParam(value = "name", defaultValue = "Guest") String name) {return "Welcome, " + name; }
如果用户访问
/welcome
而不提供name
参数,则默认使用"Guest"
作为name
的值。 -
非必填参数:
@GetMapping("/info") public String userInfo(@RequestParam(value = "id", required = false) Integer id) {if (id == null) {return "No user specified.";} else {return "User ID: " + id;} }
在这个例子中,
id
参数不是必需的。如果请求中没有提供id
参数,方法将返回"No user specified."
。
7. @RequestBody
- 作用: 用于将HTTP请求的正文(body)直接绑定到一个方法参数上。它通常用于处理
POST
或PUT
请求,特别是当客户端发送的数据格式为 JSON 或 XML 时。 - 应用场景: 当你需要从客户端接收复杂的对象数据而不是简单的查询参数或表单数据时,
@RequestBody
就非常有用。例如,在 RESTful Web 服务中,客户端可能会发送一个 JSON 格式的用户信息给服务器以创建一个新的用户账户。 -
工作原理:
@RequestBody
注解告诉 Spring 框架,方法参数应绑定到 HTTP 请求体中的数据。Spring 使用 HttpMessageConverter 将请求体中的数据转换为你指定的方法参数类型。如果请求体是 JSON 格式,Spring 默认会使用 Jackson 库将其转换为 Java 对象。 -
示例代码详解:
假设我们有一个简单的 User 类:
public class User {private String name;private int age;// Getters and Setters }
接下来,我们将编写一个控制器来处理创建新用户的请求:
@RestController @RequestMapping("/users") public class UserController {@PostMapping("/create")public ResponseEntity<String> createUser(@RequestBody User user) {// 在这里处理业务逻辑,比如保存用户到数据库System.out.println("Creating user: " + user.getName() + ", Age: " + user.getAge());return new ResponseEntity<>("User created successfully", HttpStatus.CREATED);} }
在这个例子中,
@RequestBody User user
表明我们需要从请求体中接收一个 JSON 格式的 User 对象。假设客户端发送如下 JSON 数据:{"name": "John Doe","age": 30 }
Spring 将自动将这个 JSON 转换为 User 对象并传递给
createUser
方法。
8. @ResponseBody
- 作用: 用于指示一个方法的返回值应直接作为 HTTP 响应体写入,并且不会被视图解析器解析。它通常用于 RESTful Web 服务中,返回 JSON 或 XML 格式的数据给客户端。
- 应用场景: 当你希望从控制器方法直接返回数据而不是视图名称时,
@ResponseBody
就显得非常有用。例如,在构建 REST API 时,你可能想要返回一个对象或集合作为响应,而这个响应通常是 JSON 或 XML 格式的 -
工作原理:当一个方法被标记为
@ResponseBody
,Spring 会使用适当的 HttpMessageConverter 将返回的对象转换为 HTTP 响应体的内容。如果客户端请求接受类型是 application/json,Spring 默认会使用 Jackson 库来序列化 Java 对象到 JSON 格式。 -
示例代码详解:
假设我们有一个简单的 User 类:
public class User {private String name;private int age;// Getters and Setters }
接下来,我们将编写一个控制器来处理查询用户信息的请求:
@RestController @RequestMapping("/users") public class UserController {@GetMapping("/getUser")@ResponseBodypublic User getUser() {// 创建并返回一个User对象作为示例User user = new User();user.setName("John Doe");user.setAge(30);return user;} }
在这个例子中,
@ResponseBody
注解表明getUser()
方法的返回值(即 User 对象)应当直接写入 HTTP 响应体。假设客户端发送了一个 GET 请求到/users/getUser
,服务器将返回如下 JSON 数据:{"name": "John Doe","age": 30 }
注意:在上面的例子中,实际上不需要显式地添加
@ResponseBody
注解,因为@RestController
注解已经隐式地应用了@ResponseBody
到所有的请求映射方法上。
以上只是Spring MVC中常用的一部分注解。每个注解都有其特定的作用和适用场景,合理使用这些注解可以大大简化代码编写,提高开发效率。希望这个详细的描述能帮助你更好地理解和应用Spring MVC。
相关文章:
Spring MVC常见注解详解
Spring MVC提供了丰富的注解,以简化Web应用开发过程。下面我将详细描述一些主要的注解、它们的作用、应用场景以及具体的应用示例。 1. Controller 作用: 标记一个类作为Spring MVC的控制器组件。这个注解是定义处理HTTP请求的入口点。 标识控制器组件: Controlle…...

【前端分享】CSS实现3种翻页效果类型,附源码!
使用 css 可以实现多种翻页效果,比如书本翻页、卡片翻转等。以下是两种常见的翻页效果实现: 效果 1:书本翻页效果 通过 transform 和 rotateY 实现 3D 翻页效果。 html 结构 <divclass"book"> <divclass"page pa…...

vue使用rules实现表单校验——校验用户名和密码
编写校验规则 常规校验 const rules {username: [{ required: true, message: 请输入用户名, trigger: blur },{ min: 5, max: 16, message: 长度在 5 到 16 个字符, trigger: blur }],password: [{ required: true, message: 请输入密码, trigger: blur },{ min: 5, max: 1…...
中国古代史2
夏朝(公元前2070-公元前1600年) 1.禹建立了我国历史上第一个奴隶制国家–夏朝,定都阳城。禹传启,世袭制代替禅让制。 2.夏代都城:二里头遗址位于今河南洛阳偃师二里头村。发现了大型绿松石龙形器,被命名为…...
Linux云计算训练营笔记day05(Rocky Linux中的命令:管道操作 |、wc、find、vim)
管道操作 | 作用: 将前面命令的输出,传递给后面命令,作为后面命令的参数 head -3 /etc/passwd | tail -1 取第三行 head -8 /etc/passwd | tail -3 | cat -n 取6 7 8行 ifconfig | head -2 | tail -1 只查看IP地址 ifconfig | grep 192 过滤192的ip…...

diy装机成功录
三天前,我正式开启了这次装机之旅,购入了一颗性能强劲的 i5-12400 CPU,一块绘图能力出色的 3060ti 显卡,还有技嘉主板、高效散热器、16G 内存条、2T 固态硬盘,以及气派的机箱和风扇,满心期待能亲手打造一台…...
Flink 实时数据一致性与 Exactly-Once 语义保障实战
在构建企业级实时数仓的过程中,“数据一致性” 是保障指标准确性的核心能力,尤其是在金融、电商、医疗等对数据敏感度极高的场景中。Flink 作为流批一体的实时计算引擎,其内建的 Exactly-Once 语义为我们提供了强有力的保障机制。本篇将围绕如何实现端到端的数据一致性、如何…...
两个数组的交集(暴力、set、哈希)
一.题目 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2]示例 2: 输入…...

【 Redis | 实战篇 缓存 】
目录 前言: 1.认识缓存 2.添加Redis缓存 2.1.根据id查询商铺缓存 2.2.优化根据id查询商铺缓存 3.缓存更新策略 3.1.三种策略 3.2.策略选择 3.3.主动更新的方案 3.4. Cache Aside的模式选择 3.5.最佳实践方案 4.缓存三大问题 4.1.缓存穿透 4.1.1.介绍 …...

2025年全新 GPT 4.5 AI 大模型 国内免费调用
一、中转账号注册 第一步:打开宙流AI中转站,网站地址如下: 宙流AI中转站 按照上图中的操作步骤,通过邮箱进行账号注册,注册完毕后,网站初始会分配0.4刀的免费额度,获取额度后,即可…...

“睿思 BI” 系统介绍
“睿思 BI” 商业智能系统是由成都睿思商智科技有限公司自主研发的企业数据分析系统,以下是对该系统的详细介绍: 功能模块 : • 数据集成与准备 :支持数据导入、数据填报、数据 ETL 等功能,可抽取企业在经营过程中产生…...
《C++探幽:模板从初阶到进阶》
文章目录 :red_circle:一、模板基础:开启泛型编程之门(一)泛型编程的必要性(二)函数模板1. 函数模板概念2. 函数模板定义格式3. 函数模板原理4. 函数模板实例化5. 模板参数匹配原则 (三)类模板1…...
【Elasticsearch】在kibana中能获取已创建的api keys吗?
在 Kibana 中,目前没有直接的界面功能可以列出或查看已创建的 API 密钥(API keys)。 API 密钥的管理和查看主要通过 Elasticsearch 的 REST API 来完成,而不是通过 Kibana 的管理界面。 在 Kibana 中使用 Dev Tools 查看 API 密钥…...
Spring事务管理实现机制
Spring通过一系列精妙的抽象和实现来完成事务的融入、挂起和嵌套操作。下面我将详细解析Spring如何实现这些事务行为。 1. 核心组件 Spring事务管理的核心组件包括: PlatformTransactionManager:事务管理器的抽象接口 TransactionDefinitionÿ…...
[面试]SoC验证工程师面试常见问题(七)低速接口篇
SoC验证工程师面试常见问题(七)低速接口篇 摘要:低速接口是嵌入式系统和 SoC (System on Chip) 中常用的通信接口,主要用于设备间的短距离、低带宽数据传输。相比高速接口(如 PCIe、USB 3.0),低速接口的传输速率较低(通常在 kbps 到几 Mbps 范围),但具有简单…...

虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马
网络安全公司Morphisec的研究人员发现,攻击者正利用虚假人工智能(AI)平台传播名为Noodlophile Stealer的新型信息窃取木马。这种复杂攻击手法利用AI工具的热度诱骗用户下载恶意软件,窃取浏览器凭证、加密货币钱包,并可…...
【Qt】之【Bug】点击按钮(ui->pushButton)触发非本类设置的槽函数
解决 先说解决办法,按钮在ui为默认命名ui->pushButton,后面改了下按钮名为该按钮的功能相关,就不会随意触发其他槽函数了。 没想到是这个原因。。。 可能是之前默认的objectName与旧的槽函数自动连接了 记录一下,找了好久其他的原因。 以…...
Metasploit 4.22.7:企业级渗透测试新突破
前言 Metasploit作为全球最受欢迎的渗透测试框架,其最新版本4.22.7-2025050101带来了企业级开发的全新可能。 本文将从框架基础架构、模块类型与开发规范入手,逐步深入企业级功能如MetaModules任务重放和自动化测试,最终通过实战案例展示如何利用最新功能开发高效漏洞利用模…...
【LeetCode 热题 100】215. 数组中的第K个最大元素(Python 快速选择详解)
在刷 LeetCode 的过程中,“第K大”是一个非常高频的考点,而题目 215. 数组中的第K个最大元素 就是经典代表。这道题不仅考察我们对排序的理解,还挑战我们写出时间复杂度为 O(n) 的算法。 本文将带你深入理解并实现一个基于快速选择ÿ…...

麦科信获评CIAS2025金翎奖【半导体制造与封测领域优质供应商】
在苏州举办的2025CIAS动力能源与半导体创新发展大会上,深圳麦科信科技有限公司凭借在测试测量领域的技术积累,入选半导体制造与封测领域优质供应商榜单。本届大会以"新能源芯时代"为主题,汇集了来自功率半导体、第三代材料应用等领…...

指针运算典型例题解析
1.题目1 该代码运行的结果是什么? #include <stdio.h> int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } 解析: 运行结果: 2.题目2 在X86…...

DAX 权威指南1:DAX计算、表函数与计算上下文
参考《DAX 权威指南 第二版》 文章目录 二、DAX简介2.1 理解 DAX 计算2.2 计算列和度量值2.3 变量2.3.1 VAR简介2.3.2 VAR的特性 2.4 DAX 错误处理2.4.1 DAX 错误类型2.4.1.1 转换错误2.4.1.2 算术运算错误2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函数拦截错误2.4.2.1 安全地进…...

使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据
作者:来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会,了解如…...

20250508在WIN10下使用移远的4G模块EC200A-CN直接上网
1、在WIN10/11下安装驱动程序:Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip 2、使用移远的专用串口工具:QCOM_V1.8.2.7z QCOM_V1.8.2_win64.exe 3、配置串口UART42/COM42【移远会自动生成连续三个串口,最小的那一个】 AT命令…...

C++(6):逻辑运算符
目录 1. 代码示例 示例 1:基础用法 示例 2:条件判断 2. 短路求值(Short-Circuit Evaluation) 代码示例 3. 实际应用场景 场景 1:输入合法性验证 场景 2:游戏状态判断 4. 注意事项 逻辑运算符用于组…...

NXP iMX8MP ARM 平台多屏幕克隆显示测试
By Toradex秦海 1). 简介 NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出,在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动,前端默认基于 Weston Compositor。因此在默认情况下连接多个屏…...
探秘 Canva AI 图像生成器:重塑设计创作新范式
Canva 凭借简洁易用的界面和海量模板资源,早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出,更是为设计领域带来了一场深刻变革,以智能化的手段重塑了图像创作的方式与边界。 技术内核:AI 如何驱动图像生成 Can…...

【数据结构】——栈
一、栈的概念和结构 栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(Last InFirst O…...

Navicat中保存的数据库密码找回 Java 8
导出数据库连接打开导出的connections.ncx文件找到加密的password放入java程序中解密即可 package com.asia.card.cloud.enterprise.api;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.cha…...
构件是一个逻辑概念,还是一个物理概念?
在软件架构中,构件(Component)既可以是逻辑概念,也可以是物理概念,具体取决于上下文和系统设计的需求。以下是两种视角的详细分析: 1. 逻辑概念(抽象层面) 定义:构件是系统功能的逻辑划分,表示一组相关的职责或行为,不直接对应物理实现。 …...