SpringBoot Lombok使用详解:从入门到精通(注解最全)
liuian 2025-07-14 18:27 136 浏览
一、Lombok概述与基础使用
1.1 Lombok是什么
Lombok是一个Java库,它通过注解的方式自动生成Java代码(如getter、setter、toString等),从而减少样板代码的编写,提高开发效率。根据我的项目经验,Lombok可以显著减少约30%-50%的JavaBean代码量。
Lombok的核心原理是在编译时通过注解处理器(Annotation Processor)动态修改抽象语法树(AST),生成对应的字节码。这意味着使用Lombok不会增加运行时负担,因为它只在编译阶段工作。
1.2 Lombok的优势与劣势
下表对比了使用Lombok与传统Java开发的差异:
对比维度 | 传统Java开发 | 使用Lombok开发 |
代码量 | 需要手动编写大量样板代码 | 自动生成,代码简洁 |
可读性 | 业务逻辑被样板代码淹没 | 聚焦业务逻辑,更清晰 |
维护性 | 修改字段需同步修改多个方法 | 修改字段自动同步 |
学习曲线 | 无需额外学习 | 需要学习注解含义 |
团队协作 | 无需特殊配置 | 需要统一开发环境配置 |
调试难度 | 直接查看完整代码 | 需IDE插件支持查看生成代码 |
第三方依赖 | 无 | 需要引入Lombok依赖 |
1.3 环境准备与基础配置
1.3.1 引入Lombok依赖
在Spring Boot项目中引入Lombok非常简单,只需在pom.xml中添加以下依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version> <!-- 使用最新稳定版本 -->
<scope>provided</scope>
</dependency>1.3.2 IDE插件安装
由于Lombok在编译时生成代码,为了让IDE能正确识别这些生成的代码,需要安装对应的插件:
- IntelliJ IDEA: 通过File -> Settings -> Plugins搜索"Lombok Plugin"安装
- Eclipse: 下载lombok.jar并双击运行安装
1.3.3 基础注解使用
让我们从一个最简单的JavaBean开始,展示Lombok如何简化代码:
传统JavaBean写法:
public class User {
private Long id;
private String username;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
// 其他getter/setter...
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
// 冗长的equals实现...
}
@Override
public int hashCode() {
// hashCode实现...
}
}使用Lombok后的写法:
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String password;
}这个简单的例子展示了Lombok的强大之处 - 一个@Data注解就替代了数十行代码。@Data是一个复合注解,它包含了以下功能:
- 所有字段的getter(final字段除外)
- 所有非final字段的setter
- toString()方法
- equals()和hashCode()方法
- 必要的构造函数
二、Lombok核心注解详解
2.1 常用基础注解
2.1.1 @Getter/@Setter
@Getter和@Setter是最基础的注解,用于生成getter和setter方法。
public class User {
@Getter @Setter private Long id;
@Getter(
value = AccessLevel.PROTECTED // 设置访问级别为protected
)
@Setter(
value = AccessLevel.PRIVATE, // 设置访问级别为private
onMethod_ = @Deprecated // 在生成的方法上添加@Deprecated注解
)
private String password;
}生成的代码相当于:
public class User {
private Long id;
private String password;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
protected String getPassword() { return password; }
@Deprecated
private void setPassword(String password) { this.password = password; }
}2.1.2 @ToString
@ToString注解自动生成toString()方法,默认包含所有非静态字段。
@ToString(
exclude = {"password"}, // 排除password字段
includeFieldNames = false, // 不包含字段名
callSuper = true // 包含父类的toString结果
)
public class User extends BaseEntity {
private Long id;
private String username;
private String password;
}生成的toString()方法输出类似:
User(super=BaseEntity(createdAt=2023-01-01), id=1, username=admin)2.1.3 @EqualsAndHashCode
@EqualsAndHashCode生成equals()和hashCode()方法实现。
@EqualsAndHashCode(
exclude = {"createdAt"}, // 排除createdAt字段
callSuper = true // 包含父类的equals和hashCode
)
public class User extends BaseEntity {
private Long id;
private String username;
private Date createdAt;
}2.1.4 @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
Lombok提供了三种构造器生成方式:
@NoArgsConstructor // 无参构造器
@RequiredArgsConstructor // 为所有final或@NonNull字段生成构造器
@AllArgsConstructor // 全参构造器
public class User {
private Long id;
@NonNull private String username;
private final String role = "USER";
}2.2 实用注解
2.2.1 @Data
@Data是一个复合注解,相当于:
- @Getter
- @Setter
- @ToString
- @EqualsAndHashCode
- @RequiredArgsConstructor
@Data
public class Product {
private Long id;
private String name;
private BigDecimal price;
}2.2.2 @Builder
@Builder实现了建造者模式,提供了一种更优雅的对象创建方式。
@Builder
public class Order {
private Long id;
private String orderNo;
private BigDecimal amount;
}
// 使用方式
Order order = Order.builder()
.id(1L)
.orderNo("20230101123456")
.amount(new BigDecimal("100.00"))
.build();2.2.3 @Slf4j
@Slf4j自动生成日志对象,避免了手动创建Logger的繁琐。
@Slf4j
public class OrderService {
public void createOrder() {
log.info("Creating order...");
try {
// 业务逻辑
log.debug("Order created successfully");
} catch (Exception e) {
log.error("Failed to create order", e);
}
}
}2.3 高级注解
2.3.1 @Value
@Value是不变类(immutable class)的快捷方式,相当于:
- final字段
- 只有getter
- 全参构造器
- toString/equals/hashCode
@Value
public class ImmutableUser {
Long id;
String username;
String role;
}2.3.2 @SneakyThrows
@SneakyThrows可以偷偷抛出受检异常而不在方法签名中声明。
public class FileUtil {
@SneakyThrows
public static String readFile(String path) {
return Files.readString(Paths.get(path));
}
}2.3.3 @Cleanup
@Cleanup自动管理资源,确保资源使用后被正确关闭。
public class FileUtil {
@SneakyThrows
public static void copyFile(String src, String dest) {
@Cleanup InputStream in = new FileInputStream(src);
@Cleanup OutputStream out = new FileOutputStream(dest);
in.transferTo(out);
}
}三、Lombok在Spring Boot中的实战应用
3.1 实体类(Entity)开发
在Spring Data JPA中,实体类通常需要大量样板代码,Lombok可以极大简化这一过程。
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String name;
@Column(precision = 10, scale = 2)
private BigDecimal price;
@Column(updatable = false)
private LocalDateTime createdAt;
@Version
private Integer version;
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
}
}3.2 DTO/VO对象开发
数据传输对象(DTO)和值对象(VO)通常只包含数据和简单逻辑,非常适合使用Lombok。
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {
private Long id;
private String username;
private String email;
private String phone;
@Data
public static class Address {
private String province;
private String city;
private String detail;
}
}3.3 控制器(Controller)开发
在Controller中,我们经常需要记录日志,@Slf4j可以简化这一过程。
@RestController
@RequestMapping("/api/users")
@Slf4j
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
log.debug("Fetching user with id: {}", id);
return ResponseEntity.ok(userService.getUserById(id));
}
@PostMapping
public ResponseEntity<Void> createUser(@Valid @RequestBody UserDTO userDTO) {
log.info("Creating new user: {}", userDTO.getUsername());
userService.createUser(userDTO);
return ResponseEntity.created(URI.create("/api/users")).build();
}
}3.4 服务层(Service)开发
服务层通常需要事务管理和日志记录,Lombok也能提供帮助。
@Service
@Slf4j
@RequiredArgsConstructor
@Transactional
public class OrderServiceImpl implements OrderService {
private final OrderRepository orderRepository;
private final ProductRepository productRepository;
@Override
public OrderDTO createOrder(OrderCreateDTO createDTO) {
log.info("Creating order for user: {}", createDTO.getUserId());
Product product = productRepository.findById(createDTO.getProductId())
.orElseThrow(() -> {
log.error("Product not found: {}", createDTO.getProductId());
return new ResourceNotFoundException("Product not found");
});
Order order = Order.builder()
.userId(createDTO.getUserId())
.productId(product.getId())
.amount(product.getPrice())
.status(OrderStatus.CREATED)
.build();
return convertToDTO(orderRepository.save(order));
}
private OrderDTO convertToDTO(Order order) {
// 转换逻辑
}
}四、Lombok高级特性与最佳实践
4.1 自定义Lombok配置
在项目根目录下创建lombok.config文件,可以自定义Lombok行为:
# 将生成的构造器设为protected
lombok.anyConstructor.suppressConstructorProperties = true
# 禁止使用@EqualsAndHashCode的callSuper=true警告
config.stopBubbling = true
lombok.equalsAndHashCode.callSuper = warn
# 全局配置@ToString不包含字段名
lombok.toString.includeFieldNames = false4.2 与MapStruct集成
MapStruct是一个代码生成器,用于Java Bean之间的映射,与Lombok配合使用效果极佳。
@Mapper(componentModel = "spring")
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mapping(source = "username", target = "name")
UserDTO toDTO(User user);
@Mapping(source = "name", target = "username")
User toEntity(UserDTO userDTO);
}
@Data
public class User {
private Long id;
private String username;
private String password;
}
@Data
public class UserDTO {
private Long id;
private String name;
private String email;
}4.3 与Jackson集成
Lombok与Jackson JSON库可以很好地配合使用,但需要注意一些细节。
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL) // 只包含非null字段
public class ApiResponse<T> {
private Integer code;
private String message;
private T data;
@JsonIgnore // 忽略这个getter
public boolean isSuccess() {
return code == 200;
}
}4.4 常见问题与解决方案
4.4.1 与JPA的兼容性问题
当使用JPA的懒加载(Lazy Loading)时,直接调用toString()可能导致异常。解决方案:
@Entity
@Data
@ToString(exclude = {"orders"}) // 排除关联集合
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}4.4.2 与继承体系的问题
在继承体系中,正确配置callSuper非常重要:
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AdminUser extends User {
private String privilege;
}4.4.3 性能考虑
虽然Lombok在编译时生成代码,但某些复杂注解(如@Builder)生成的代码量较大,在性能敏感的场景需要权衡使用。
五、Lombok原理深入解析
5.1 Lombok工作原理
Lombok的工作流程可以用以下序列图表示:
Java CompilerLombok Annotation ProcessorIDEDeveloperJava CompilerLombok Annotation ProcessorIDEDeveloper编写带有Lombok注解的Java文件请求解析AST修改AST返回修改后的AST提供增强的代码视图显示增强后的代码效果编译代码再次处理AST生成最终字节码5.2 注解处理流程
Lombok的注解处理发生在编译期的以下阶段:
- 解析阶段:Java编译器解析源代码生成AST
- 注解处理阶段:Lombok的注解处理器修改AST
- 分析生成阶段:基于修改后的AST生成字节码
5.3 与IDE的集成原理
IDE通过Lombok插件实现以下功能:
- 在编辑器中显示生成的代码
- 提供代码补全建议
- 支持导航到"虚拟"的生成方法
六、Lombok替代方案与对比
6.1 手动编写代码
优点:
- 完全控制代码细节
- 无需额外依赖
- 更好的可调试性
缺点:
- 代码冗长
- 维护成本高
- 容易出错
6.2 IDE代码生成
优点:
- 可视化的生成过程
- 可以选择性生成
缺点:
- 生成的代码仍需保留在源文件中
- 字段变更时需要重新生成
- 不同IDE生成风格可能不一致
6.3 其他代码生成工具
工具 | 特点 | 适用场景 |
Lombok | 注解驱动,编译时生成,无运行时依赖 | 日常JavaBean开发 |
AutoValue | 专注于生成不可变类 | 需要不可变对象的场景 |
Immutables | 类似AutoValue但功能更丰富 | 复杂不可变对象需求 |
Kotlin | 语言层面支持数据类(data class) | 使用Kotlin的项目 |
Record类(Java14+) | Java语言内置的简化数据载体定义 | Java 14+的简单数据传输对象 |
七、Lombok在企业项目中的实践建议
7.1 项目规范制定
- 注解使用规范:
- 实体类:使用@Data+@Builder+@NoArgsConstructor+@AllArgsConstructor
- DTO:使用@Value或@Data+@Builder
- 工具类:使用@UtilityClass
- 代码风格统一:
- 统一配置lombok.config
- 规定toString的格式
- 统一equals/hashCode的实现方式
7.2 团队协作注意事项
- 新成员培训:
- 基础注解的含义
- IDE插件的安装配置
- 常见问题的解决方法
- 代码审查要点:
- 检查是否过度使用Lombok
- 验证callSuper的正确设置
- 确认排除字段的合理性
7.3 性能优化建议
- 避免在性能关键路径使用复杂注解:
- @ToString在大对象上可能影响性能
- @EqualsAndHashCode在大型集合比较时注意
- 合理选择注解组合:
- 只使用需要的注解,而不是简单的@Data
- 考虑使用@Value替代@Data创建不可变对象
八、完整实战案例
8.1 电商系统用户模块
// 实体类
@Entity
@Table(name = "users")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = {"password", "orders"})
@EqualsAndHashCode(callSuper = true, exclude = {"orders"})
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true, length = 50)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = true)
private String email;
@Column(name = "phone_number", length = 20)
private String phoneNumber;
@Enumerated(EnumType.STRING)
private UserStatus status;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<Order> orders = new ArrayList<>();
@Embedded
private Address address;
@Version
private Integer version;
}
// DTO类
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserDTO {
private Long id;
private String username;
private String email;
private String phoneNumber;
private UserStatus status;
private AddressDTO address;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class AddressDTO {
private String province;
private String city;
private String street;
private String zipCode;
}
}
// 服务类
@Service
@Slf4j
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
private final UserMapper userMapper;
@Override
public UserDTO getUserById(Long id) {
log.debug("Fetching user with id: {}", id);
return userRepository.findById(id)
.map(userMapper::toDTO)
.orElseThrow(() -> new ResourceNotFoundException("User not found"));
}
@Override
@Transactional
public UserDTO createUser(UserCreateDTO createDTO) {
log.info("Creating new user: {}", createDTO.getUsername());
if (userRepository.existsByUsername(createDTO.getUsername())) {
throw new BusinessException("Username already exists");
}
User user = User.builder()
.username(createDTO.getUsername())
.password(passwordEncoder.encode(createDTO.getPassword()))
.email(createDTO.getEmail())
.phoneNumber(createDTO.getPhoneNumber())
.status(UserStatus.ACTIVE)
.address(convertAddress(createDTO.getAddress()))
.build();
return userMapper.toDTO(userRepository.save(user));
}
private Address convertAddress(UserDTO.AddressDTO addressDTO) {
// 转换逻辑
}
}8.2 RESTful API响应封装
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResult<T> {
private long timestamp;
private String status;
private String code;
private String message;
private T data;
private String path;
public static <T> ApiResult<T> success() {
return success(null);
}
public static <T> ApiResult<T> success(T data) {
return ApiResult.<T>builder()
.timestamp(System.currentTimeMillis())
.status("success")
.code("200")
.data(data)
.build();
}
public static ApiResult<?> error(String code, String message) {
return error(code, message, null);
}
public static ApiResult<?> error(String code, String message, String path) {
return ApiResult.builder()
.timestamp(System.currentTimeMillis())
.status("error")
.code(code)
.message(message)
.path(path)
.build();
}
}
// 使用示例
@RestController
@RequestMapping("/api/users")
@Slf4j
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
public ApiResult<UserDTO> getUser(@PathVariable Long id) {
return ApiResult.success(userService.getUserById(id));
}
@ExceptionHandler(BusinessException.class)
public ApiResult<?> handleBusinessException(BusinessException e,
HttpServletRequest request) {
log.error("Business exception: {}", e.getMessage(), e);
return ApiResult.error("400", e.getMessage(),
request.getRequestURI());
}
}九、Lombok的未来与发展
9.1 Java Record类与Lombok
Java 14引入的Record类在某些场景下可以替代Lombok:
// 使用Record
public record UserRecord(Long id, String username, String email) {}
// 使用Lombok
@Data
@AllArgsConstructor
public class UserLombok {
private Long id;
private String username;
private String email;
}比较:
- Record更简洁,但功能有限(不可变,有限的自定义能力)
- Lombok更灵活,支持可变对象和各种自定义
9.2 Lombok的未来发展方向
- 更好的Java新版本兼容性
- 更智能的代码生成策略
- 增强与其他工具链的集成
- 可能的元注解支持
9.3 何时选择/不选择Lombok
适合使用Lombok的场景:
- 大量的POJO/DTO/VO类
- 需要快速原型开发
- 团队统一规范并接受Lombok
不适合使用Lombok的场景:
- 对字节码有严格要求的场景
- 需要精细控制生成的代码
- 项目成员不熟悉Lombok且学习成本高
十、总结与个人建议
经过多年的Java开发和Lombok使用经验,我认为:
- 适度使用:Lombok是很好的生产力工具,但不要滥用。在简单DTO/实体类上使用,在复杂业务类上谨慎使用。
- 团队共识:确保团队成员都理解并接受Lombok,统一配置和风格。
- 了解原理:理解Lombok的工作原理有助于解决遇到的问题。
- 结合其他工具:与MapStruct、Jackson等工具配合使用效果更佳。
- 关注替代方案:随着Java语言发展(如Record类),评估是否可以用语言特性替代Lombok。
Lombok不是银弹,但在正确使用的场景下,它能显著提高开发效率,减少样板代码,让我们更专注于业务逻辑的实现。希望这篇全面的指南能帮助你在Spring Boot项目中更好地利用Lombok。
关注我?别别别,我怕你笑出腹肌找我赔钱。
头条对markdown的文章显示不太友好,想了解更多的可以关注微信公众号:“Eric的技术杂货库”,有更多的干货以及资料下载。
相关推荐
-
- 驱动网卡(怎么从新驱动网卡)
-
网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...
-
2026-01-30 00:37 liuian
- win10更新助手装系统(微软win10更新助手)
-
1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...
- windows11专业版密钥最新(windows11专业版激活码永久)
-
Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...
-
- 手机删过的软件恢复(手机删除过的软件怎么恢复)
-
操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...
-
2026-01-29 23:55 liuian
- 一键ghost手动备份系统步骤(一键ghost 备份)
-
步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。 步骤...
- 怎么创建局域网(怎么创建局域网打游戏)
-
1、购买路由器一台。进入路由器把dhcp功能打开 2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。 3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...
- 精灵驱动器官方下载(精灵驱动手机版下载)
-
是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...
- 一键还原系统步骤(一键还原系统有哪些)
-
1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。 2、在弹出的“准备安装”窗口中,可...
- 电脑加速器哪个好(电脑加速器哪款好)
-
我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...
- 任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)
-
是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...
- u盘怎么恢复文件(u盘文件恢复的方法)
-
开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...
- 系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)
-
1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...
-
- 剪贴板权限设置方法(剪贴板访问权限)
-
1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...
-
2026-01-29 21:37 liuian
- 平板系统重装大师(平板重装win系统)
-
如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...
- 联想官网售后服务网点(联想官网售后服务热线)
-
联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...
- 一周热门
-
-
用什么工具在Win中查看8G大的log文件?
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
windows11专业版密钥最新(windows11专业版激活码永久)
-
RK3588-HDMIRX(瑞芯微rk3588芯片手册)
-
tplink无线路由器桥接教程(tplink路由器如何进行无线桥接)
-
用纯Python轻松构建Web UI:Remi 动态更新,实时刷新界面内容
-
R语言 | CNS绘图第1款——linkET万物皆可连
-
都说Feign是RPC,没有侵入性,为什么我的代码越来越像 C++
-
如何在 Ubuntu 命令行中使用 Wireshark 进行抓包?
-
自行部署一款免费高颜值的IT资产管理系统-咖啡壶chemex
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
