SPring Boot整合第三方框架
springboot整合第三方框架
1. 整合mybatis
1.1引入依赖——pom.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>sbAndMybatis</artifactId><version>0.0.1-SNAPSHOT</version><name>sbAndMybatis</name><description>sbAndMybatis</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis和springboot的整合的依赖--><dependency><groupId>repMaven.org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency></dependencies><build><plugins><plugin><groupId>repMaven.org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.2.5</version><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
spring-boot-starter-parent的版本为2.3.12,因为jdk版本为8,只有17及以上版本的jdk才可以用3.0以上的
mybatis-spring-boot-starter的版本依赖于上述的版本,为3.0的话会出现兼容问题,采用2.1.4
spring-boot-maven-plugin自动生成的会飘红,改为使用本地仓库的插件
1.2 配置文件
spring.application.name=sbAndMybatis
#数据源的信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zmq?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456#配置mybatis映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
在该文件中可以配置关于数据库的相关信息,也可以指定端口号和上下文路径
1.3 在entiry包下生成实体类User
@Data
public class User {private Integer id;private String username;private String password;
}
1.4 在dao包下生成接口UserDao
@Repository
public interface UserDao {//添加public int insert(User user);//删除public int del(Integer id);//修改public int update(User user);//查询全部public List<User> selectAll();//根据id查询public User selectById(Integer id);
}
1.5 在resources目录下生成mapper
在该文件下生成UserMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zmq.dao.UserDao"><!--resultMap映射--><resultMap id="myMap" type="com.zmq.entity.User" autoMapping="true"><id property="id" column="id"/><result property="username" column="u_name"/></resultMap><!--添加新用户--><insert id="add">insert into user values (null,#{username},#{password})</insert><insert id="insert">insert into user values (null,#{username},#{password})</insert><update id="update">update user set u_name=#{username},password=#{password} where id=#{id}</update><delete id="del">delete from user where id=#{id}</delete><!--根据姓名和密码查询--><select id="getByOthers" resultMap="myMap">select * from user where u_name=#{username} and password=#{password}</select><select id="selectAll" resultMap="myMap">select * from user</select><select id="selectById" resultMap="myMap">select * from user where id=#{id}</select>
</mapper>
1.6 在vo包下生成R类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {private Integer code;private String msg;private Object object;
}
该类用于统一返回信息的类型
1.7 在service包下生成UserService业务接口
public interface UserService {public R insert(User user);public R del(Integer id);public R update(User user);public R selectAll();public R selectById(Integer id);
}
1.8 在service包下生成impl包
在该包下生成UserServiceImpl类,并实现UserService接口
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic R insert(User user) {int insert = userDao.insert(user);if(insert>0){return new R(200,"添加成功!",null);}else {return new R(500,"添加失败!",null);}}@Overridepublic R del(Integer id) {int del = userDao.del(id);if(del>0) {return new R(200,"删除成功!",null);}else {return new R(500,"删除失败!",null);}}@Overridepublic R update(User user) {int update = userDao.update(user);if(update>0){return new R(200,"修改成功!",null);}else {return new R(500,"修改失败!",null);}}@Overridepublic R selectAll() {List<User> list = userDao.selectAll();if(list!=null){return new R(200,"查询成功!",list);}else {return new R(500,"查询失败",null);}}@Overridepublic R selectById(Integer id) {User user = userDao.selectById(id);if(user!=null){return new R(200,"查询成功",user);}else {return new R(500,"查询失败!",null);}}
}
1.9 在controller层生成UerController类
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;//添加@PostMapping("/insert")public R insert(@RequestBody User user){return userService.insert(user);}//删除@DeleteMapping("/delete")public R delete(Integer id){return userService.del(id);}//修改@PutMapping("/update")public R update(@RequestBody User user){return userService.update(user);}//查询全部@GetMapping("/selectAll")public R selectAll(){return userService.selectAll();}//根据id查询@GetMapping("/selectById")public R selectById(Integer id){return userService.selectById(id);}
}
1.10 在主类上添加注入dao层的注解
@SpringBootApplication
//为指定的dao生成代理实现类
@MapperScan(basePackages = "com.zmq.dao")
public class SbAndMybatisApplication {public static void main(String[] args) {SpringApplication.run(SbAndMybatisApplication.class, args);}}
1.11 报错
- 报错1
没有为dao生成代理实现类
- 报错2
mybatis和springboot整合的版本太高
2. 整合swagger2
2.1 什么是swagger2
swagger2就是在线生成接口文档的,而且还可以对接口进行测试
Swagger2是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,现在我们使用spring boot整合,作用:
1. 在线生成接口文档
2. 接口的功能测试
Restful风格:在controller层的注解使用:
添加:@PostMapping
删除:@DeleteMapping
修改:@PutMapping
查询:@GetMapping
2.2 为什么需要使用swagger2
因为项目为前后端分离,靠接口调用连接,就需要为每个接口生成接口文档,而手写word文档实时性差
2.3 如何使用
- 引入依赖
<!--引入swagger2依赖--><dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId><version>1.9.1.RELEASE</version></dependency><!--图形化依赖--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency>
考虑版本不兼容问题
- 创建swagger2配置类
@Configuration
public class Swagger2Config {//创建swagger实例@Beanpublic Docket docket() {Docket docket=new Docket(DocumentationType.SWAGGER_2).apiInfo(getInfo())//设置接口文档的信息.select().apis(RequestHandlerSelectors.basePackage("com.zmq.controller")) //指定为那些路径下得到类生成接口文档.build();return docket;}private ApiInfo getInfo(){Contact DEFAULT_CONTACT = new Contact("ldw", "http://www.ldw.com", "110@qq.com");ApiInfo DEFAULT = new ApiInfo("用户管理系统API", "该系统中的接口专门操作用户的", "v1.0", "http://www.baidu.com",DEFAULT_CONTACT, "dong", "http://www.jd.com", new ArrayList<VendorExtension>());return DEFAULT;}
}
@Configuration:Spring注解:声明该类为配置类
@Bean注解:用在方法上,必须用在配置类里面,将当前方法的返回值对象存入容器中
Docket对象说明:
- 构造方法:需要一个DocumentationType类对象,这里选择SWAGGER_2
Docket对象说明:
- apiInfo():用于配置swagger 信息,设置接口文档的信息
这个类对象仅有如下属性,且只有一个构造方法。
- 在主类上开启swagger的注解驱动
@SpringBootApplication
@MapperScan(basePackages = "com.zmq.dao")
//开启文档注解
@EnableSwagger2
public class SbAndMybatisWorkApplication {public static void main(String[] args) {SpringApplication.run(SbAndMybatisWorkApplication.class, args);}}
@EnableSwagger2:开启swagger2的注解驱动
- 访问swagger接口文档
第一种:http://localhost:8080/swagger-ui.html
第二种:http://localhost:8080/doc.html
2.4 swagger2常用注解
- 对controller层的三个注解
@Api(tags=“”):使用在接口类上,对接口类的说明
@ApiOperation(value=“”):接口方法上,对接口方法的说明
@ApiImplicitParams(
@ApiImplicitParam(name=“参数名”,value=“参数说明”,required=“是否必写”,dataType=“数据类型”)
):接口方法所有参数的概述
@RestController
@RequestMapping("/user")
@Api(tags = "用户管理")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/insert")@ApiOperation(value = "添加用户")@ApiImplicitParams(@ApiImplicitParam(name = "user" ,value="用户对象",required = true,dataType = "User"))public R insert(@RequestBody User user){return userService.isnert(user);}@GetMapping("/selectAll")public R selectAll(){return userService.selectAll();}
}
- 对实体类的两个注解
@ApiModel(value=“”):使用在实体类上,对实体类的说明
@ApiModelProperty(value=“”):使用在实体类属性上,对属性的说明
@Data
@ApiModel(value = "用户实体类")
public class User {private Integer id;@ApiModelProperty(value = "用户姓名")private String username;@ApiModelProperty(value = "用户密码")private String password;
}
3. 整合定时器
在指定的时间执行相应的业务代码。场景:oss修改照片时,存在一个冗余照片。定时删除冗余照片
比如:下单,30分钟未支付就取消订单
- 引入定时器依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
- 创建一个定时业务类
@Configuration
public class QuartzConfig {//定时业务代码//定义定时规则@Scheduled(cron = "0/5 * * * * ?")public void show(){System.out.println("*******************");//发生短信 或者删除oss冗余文件 或者取消订单}
}
cron:表达式
- 在主类上开启定时器注解驱动
@SpringBootApplication
@MapperScan(basePackages = "com.zmq.dao")
//开启文档注解
@EnableSwagger2
//开启定时器注解
@EnableScheduling
public class SbAndMybatisWorkApplication {public static void main(String[] args) {SpringApplication.run(SbAndMybatisWorkApplication.class, args);}
}
@EnableScheduling:开启定时器注解驱动
在线生成cron表达式:https://cron.ciding.cc/
4. 整合mybatis-plus
4.1 概述
MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强,不做改变,为简化开发、提高效率而生
4.2 特点
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询。
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
4.3 使用
- 引入依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version>
</dependency>
若因为MyBatis-Plus和MyBatis的依赖版本问题而报错,可以将MyBatis的依赖删除,因为MyBatis-Plus中包含MyBatis的依赖,且保证了版本的一致性
- 配置文件
spring.application.name=sbAndMPspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zmq1?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456#??mybatis???????
mybatis.mapper-locations=classpath:mapper/*.xml#配置日志--sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
- 实体类
@TableName(value ="user")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {/*** 主键ID*/@TableIdprivate Long id;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 邮箱*/private String email;@TableField(exist = false)private static final long serialVersionUID = 1L;
}
- mapper层
@Repository
public interface UserMapper extends BaseMapper<User> {
}
- 在主类上为mapper生成代理实现类
//生成代理实现类
@MapperScan("com.zmq.mapper")
public class SbAndMpApplication {public static void main(String[] args) { SpringApplication.run(SbAndMpApplication.class, args);}
}
测试:
- 根据id查询
@SpringBootTest
class Qy174SpringbootMpApplicationTests {@Autowiredprivate UserMapper userMapper;/*** 如果出现实体类和表名不一致。@TableName* 如果出现实体类属性名和字段名不一致。@TableField*/@Testvoid testSelectById() {User user = userMapper.selectById(1);System.out.println(user);}}
- 添加
@Testvoid testInsert(){//添加一条记录
// User user=new User(null,"qqq",19,"123@qq.com");
// //添加--把生成的主键也会赋值给对象中主键属性
// System.out.println("填进去:"+user);
// int row = userMapper.insert(user);
// System.out.println(row);
// System.out.println("填进去后:"+user);//批量添加
// List<User> list=new ArrayList<>();
// list.add(new User(null,"aa",18,"123@qq.com"));
// list.add(new User(null,"aaa",19,"223@qq.com"));
// list.add(new User(null,"vb",19,"323@qq.com"));
// list.add(new User(null,"bb",17,"323@qq.com"));
// List<BatchResult> insert = userMapper.insert(list);//如果有id则修改 没有则添加User user=new User(2,"sss",19,"123@qq.com");userMapper.insertOrUpdate(user);}
相关文章:

SPring Boot整合第三方框架
springboot整合第三方框架 1. 整合mybatis 1.1引入依赖——pom.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…...
读取sqlserver数据库中varbinary(max)类型的内容,并将图片信息显示在前端页面
目录 1.varbinary(max)的说明 2.图片显示 3.总结 1.varbinary(max)的说明 varbinary(max) 是一种SQL Server数据库字段类型,用于存储二进制数据,可以存储最大长度的二进制数据。以下是关于 varbinary(max) 的说明: 存储容量: 可以存储最大…...

orcad导出pdf 缺少title block
在OrCAD中导出PDF时没有Title Block 最后确认问题在这里: 要勾选上Title Block Visible下面的print...
XML 验证器:确保数据完整性和准确性的关键工具
XML 验证器:确保数据完整性和准确性的关键工具 引言 在当今数字化时代,数据的有效管理和交换至关重要。XML(可扩展标记语言)作为一种用于存储和传输数据的语言,广泛用于各种应用程序和系统之间。为确保XML数据的完整…...

opencv学习:图像视频的读取截取部分图像数据颜色通道提取合并颜色通道边界填充数值计算图像融合
一、计算机眼中的图像 1.图像操作 构成像素点的数字在0~255之间 RGB叫做图像的颜色通道 h500,w500 2.灰度图像 3. 彩色图像 4.图像的读取 5.视频的读取 cv2.VideoCapture()--在OpenCV中,可以使用VideoCapture来读取视频文件,或是摄像头数…...

数据结构——单链表详解(超详细)(2)
前言: 上一篇文章小编简单的介绍了单链表的概念和一些函数的实现,不过为了保证文章的简洁,小编把它分成了两篇来写,这一篇小编紧接上一篇文章继续写单链表函数功能的实现: 目录: 1.单链表剩余函数的编写 1.…...
类和对象(2
*续上文中的运算符重载 4 重载运算符时,有前置和后置的,运算符重载的函数名都是operator, 无法很好区分 所以c规定,后置重载时,增加一个int形参 与前置做区分 5 重载<<和>>时需要重载为全局函数, 因为重载为成员函数时, this指针默认抢占了第一个形参位, 第一个形参…...
AcWing 668. 游戏时间2
读取四个整数 A,B,C,D𝐴,𝐵,𝐶,𝐷,用来表示游戏的开始时间和结束时间。 其中 A𝐴 和 B𝐵 为开始时刻的小时和分钟数,C𝐶 和 D𝐷 为结束时刻的小时和分钟数。…...
AI发展下的伦理挑战,应当如何应对?
针对人工智能(AI)发展中面临的伦理挑战,构建一个全面、有效的治理体系至关重要。以下是对三大关键方向——隐私保护、算法公正与透明度、深度伪造管控——的深入探讨与具体实践方案: 方向一:构建可靠的AI隐私保护机制…...

Java面试题--JVM大厂篇之深入解析JVM中的Serial GC:工作原理与代际区别
目录 引言: 正文: 一、Serial GC工作原理 年轻代垃圾回收(Minor GC): 老年代垃圾回收(Major GC或Full GC): 二、年轻代和老年代的区别 年轻代(Young Generation&a…...

网络安全高级工具软件100套
1、 Nessus:最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上。它不止永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance–终端用户授权协议)。 它…...
Ubuntu 添加gcc头文件搜索路径
对个人用户生效 sudo vim ~/.bashrc在该文件末尾添加 #gcc C_INCLUDE_PATH$C_INCLUDE_PATH:your_path export C_INCLUDE_PATH #g CPLUS_INCLUDE_PATH$CPLUS_INCLUDE_PATH:your_path export CPLUS_INCLUDE_PATH最后,重启终端即可生效 可用以下命令查看搜索路径 ec…...
c++写数据结构进入文件
以下定义一个数据结构 struct SData {std::string url;int number;std::string memo; };写入文件 void StorageDataToFile(const std::string& filename, const SData& data) {std::ofstream outFile(filename);if (outFile.is_open()) {// 使用std::stringstream格式…...

Java实验4
实验内容 考试题 要求在一个界面内至少显示5道选择题,每道题4个选项。题目从数据库读取。表结构自定义。 另有2个命令按钮,分别为“重新答题”(全部选项及正确答题数清空)和“提交”(计算),在…...

优化 Java 数据结构选择与使用,提升程序性能与可维护性
优化 Java 数据结构选择与使用,提升程序性能与可维护性 引言 在软件开发中,数据结构的选择是影响程序性能、内存使用以及代码可维护性的关键因素之一。Java 作为一门广泛使用的编程语言,提供了丰富的内置数据结构,如数组、链表、…...

华为USG6000V防火墙安全策略用户认证
目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1🤣防火墙FW1web服务配置 2.网络配置 要求1:DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 要求2:生产区不…...

Windows 应急响应手册v1.2 -百度网盘下载
家好,《Windows 应急响应手册 v1.2》 发布啦! 本次是一个大更新,解决了两个大问题,添加了4个大的事件处置流程以及一些更新,下载链接在文末 两个大问题是: Windows 平台的 Adobe acrobat DC 、Firefox 浏…...

Billu_b0x靶机
信息收集 使用arp-scan 生成网络接口地址来查看ip 输入命令: arp-scan -l 可以查看到我们的目标ip为192.168.187.153 nmap扫描端口开放 输入命令: nmap -min-rate 10000 -p- 192.168.187.153 可以看到开放2个端口 nmap扫描端口信息 输入命令&…...

GitHub+Picgo图片上传
Picgo下载,修改安装路径,其他一路下一步! 地址 注册GitHub,注册过程不详细展开,不会的百度一下 地址 新建GitHub仓库存放图片 ——————————————————————————————————————————…...

springboot的事务管理
在yml配置文件中添加以下:logging.level.org.springframework.jdbc.support.JdbcTransactionManagerdebug...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...