自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

专注于技术分享

人个目前就职于一家外企业500强公司担任架构师一职,在这里我会着重分享我多年来在Java开发领域的实战经验和心得体会。从企业级项目架构设计、高并发处理到微服务架构的落地实施。

  • 博客(500)
  • 资源 (10)
  • 收藏
  • 关注

原创 Spring Boot 项目中如何划分事务边界,避免长事务?

在 Spring Boot 应用中,合理的划分事务边界对于数据一致性、提高并发性能以及避免资源长时间占用(即避免长事务)至关重要。长事务会长时间持有数据库锁和连接,降低系统吞吐量,甚至可能导致死锁或超时。通过综合运用这些策略,可以有效的管理 Spring Boot 应用中的事务边界,确保事务既能保证数据一致性,又能保持简短高效,从而提升整体系统性能和稳定性。

2025-06-12 18:03:59 339

原创 Spring Boot 项目中Http 请求如何对响应体进行压缩

我们梳理一下 Spring Boot 项目中是如何对 HTTP 请求的进行压缩。(请注意:压缩是针对服务器返回给客户端的,而不是客户端发给服务器的请求 URL 或请求体)。核心思想:减少网络传输的数据量,加快客户端加载速度。

2025-06-12 17:58:43 310

原创 真正优秀的程序员有哪些与众不同之处?

从“能写代码”到“真正优秀”,是一个漫长的修炼过程。它标志着一个程序员从**“代码实现者”转变为“问题解决者”,再到“价值创造者”**的过程。“任何一个傻瓜都能写出计算机可以理解的代码。唯有优秀的程序员,才能写出人类可以理解的代码。真正顶尖的程序员,不仅能写出人类可以理解的代码,还能构建出能够持续创造价值、并赋能他人的可靠系统。

2025-06-11 17:47:57 302

原创 Spring Boot 中ConditionalOnClass、ConditionalOnMissingBean 注解详解

和:首先确保相关的库(即类)存在于类路径中。如果库都不存在,谈论配置其 Bean 毫无意义。:然后,即使相关的库存在,也要检查用户是否已经自己定义了相应的 Bean。如果用户已经定义了,那么自动配置就应该尊重用户的选择,不创建默认的 Bean。@ConditionalOnClass(SomeExternalLibrary.class) // 步骤1:确保库存在@Bean@ConditionalOnMissingBean // 步骤2:确保用户没有提供自己的 Bean。

2025-06-11 17:36:03 556 1

原创 Spring Data MongoDB 提供了哪些核心组件?

Spring Data MongoDB 是 Spring Data 项目的一部分,旨在简化 Spring 应用程序与 MongoDB 数据库的集成。它提供了一系列核心组件,使得开发者可以更方便地进行数据访问操作。这些组件共同构成了一个强大且易于使用的框架,使得 Java 开发者可以高效的利用 MongoDB 的特性,同时保持与 Spring 生态系统的良好集成。

2025-06-11 17:34:29 440

原创 在微服务架构中,怎么搭建Maven私服

在需要发布到私服的微服务项目(尤其是共享库、API 包、父 POM)的。),使其指向你的 Nexus 私服。最常用的 Maven 私服工具是。或 Maven 安装目录的。为例,介绍搭建步骤。修改 Maven 的。

2025-06-10 14:56:57 612

原创 Spring Boot 如何自动配置 MongoDB 连接?可以自定义哪些配置?

Spring Boot 通过其自动配置 (Auto-Configuration) 机制,极大的简化了 MongoDB 的连接和集成。通过这些机制,Spring Boot 提供了从简单属性配置到完全自定义 bean 定义的灵活性,以适应各种 MongoDB 连接需求。在类路径上时,它会自动尝试配置必要的 bean 来连接 MongoDB。这是一个更细粒度的方式,它允许你修改由自动配置创建的。一些常见的配置(尽管更高级的池配置可能需要自定义。的某些方面,也可以提供自己的 bean 定义。是最简单和推荐的方式。

2025-06-10 14:07:22 1014

原创 Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

极简设计:API 非常简单(PUBLISHSUBSCRIBE),上手快,集成成本低。极致性能:由于纯内存操作,消息传递延迟是微秒级的,非常适合对实时性要求苛刻的场景。轻量无依赖:如果你的项目中已经在使用 Redis,那么引入消息通信功能是零成本的,不需要额外部署一套重型的 MQ 系统。致命的可靠性问题“离线即丢失”是其最大的短板。这使得它完全不适用于任何要求消息必须送达的业务场景,如订单处理、支付通知等。无状态:无法追溯历史,无法应对消费者宕机后的消息补偿。广播天性。

2025-06-09 17:11:38 1018

原创 现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

总结来说,Redisson 等库将分布式锁的复杂性、易错点都封装了起来,提供了健壮、功能丰富且易于使用的 API。这使得开发者可以更专注于业务逻辑,而不是花费大量时间和精力去调试和完善一个底层的分布式锁实现,从而提高了开发效率和系统的稳定性。现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如。)手动实现分布式锁,提供了巨大的便利性和健壮性。

2025-06-09 11:22:35 635

原创 在Spring Boot 项目中redis 分布式锁使用详解

在 Spring Boot 项目中使用 Redis 实现分布式锁,通常有以下几种方式,从简单到复杂,各有优劣:这里我们将重点详细讲解最常见的两种方式:手动实现和使用 Redisson。这种方式最基础,可以帮助理解分布式锁的原理,但需要开发者自己处理很多细节,如锁的释放、超时、可重入性等。1. 添加依赖 (pom.xml):2. 配置 Redis (application.properties / application.yml):3. 实现一个简单的分布式锁工具类:手动实现的优缺点:Redisson

2025-06-09 10:52:58 986

原创 为什么需要Redis分布式锁?在哪些微服务场景下会用到?

或 Lua 脚本来保证原子性,并始终设置合理的过期时间来防止死锁。对于需要更高可靠性的场景,则应评估 ZooKeeper 或 etcd 等方案。它非常适用于那些对性能敏感、锁竞争激烈,且对锁的极端情况下的可靠性要求不是最高级别的微服务场景。在设计时,务必正确使用 Redis 命令(如。,前提是其提供的可靠性能满足业务需求。选择 Redis 实现分布式锁主要是看中了其。

2025-06-08 12:26:08 751

原创 什么是领域 (Domain)?什么是子域 (Subdomain)?

总而言之,理解并正确划分领域和子域,是进行有效的领域驱动设计的基石,它能帮助我们从宏观上把握业务的本质,并做出明智的设计决策。是战略设计中的核心概念,它们可以帮助我们理解和组织复杂的业务。在领域驱动设计 (DDD) 中,

2025-06-08 12:24:48 878

原创 DDD 和传统的三层架构/MVC 有什么本质区别?

DDD(领域驱动设计)与传统的三层架构/MVC(模型-视图-控制器)在设计思想、关注点和目标上有着本质的区别。虽然它们可以结合使用,但它们解决的问题层面和核心理念不同。传统三层架构/MVC 的核心关注点和目标:DDD 的核心关注点和目标:本质区别总结:如何看待它们的关系?一个简单的比喻:总而言之,传统三层/MVC 更侧重于“如何组织代码”,而 DDD 更侧重于“如何理解和表达业务”。在复杂的业务场景下,DDD 提供了更强大的武器来确保软件真正服务于业务。

2025-06-06 19:59:59 861

原创 如何利用 Redis 实现跨多个无状态服务实例的会话共享?

使用 Redis 实现跨多个无状态服务实例的会话共享是一种非常常见且有效的方案。无状态服务本身不存储会话信息,而是将用户的会话数据集中存储在外部存储中(如 Redis),这样任何一个服务实例都可以通过查询外部存储来获取和更新用户的会话状态。通过这种方式,无论用户的请求被哪个无状态服务实例处理,该实例都能通过统一的 Session ID 从 Redis 中获取到一致的会话信息,从而实现了会话共享。

2025-06-06 19:55:34 961

原创 如何设置合适的缓存过期时间(TTL)?是否有必要实现缓存预热?

设置合适的缓存过期时间(TTL - Time To Live)和决定是否有必要实现缓存预热是缓存策略中非常重要的两个方面。

2025-06-05 19:55:53 657

原创 什么时候应该使用 DDD?什么时候不适合?

重要的是要理解 DDD 的核心价值在于管理业务复杂性。在决定是否使用 DDD 时,应该首先评估你的项目是否真的面临显著的业务复杂性挑战。如果答案是肯定的,那么 DDD 很可能是一个值得投入的选择。

2025-06-05 10:29:02 430

原创 跨多个微服务使用 Redis 共享数据时,如何管理数据一致性?

在跨多个微服务使用 Redis 共享数据时,管理数据一致性是一个复杂但至关重要的问题。Redis 本身提供的原子操作和一些数据结构可以提供帮助,但大部分一致性保障需要应用层面的设计和策略。在实际开发中,通常会组合使用上述多种策略来达到所需的数据一致性。因此,很多时候我们会选择。

2025-06-05 07:23:39 1031

原创 Reids 如何处理缓存穿透、缓存击穿、缓存雪崩问题?

Redis 本身是一个高性能的键值存储系统,它提供了一些基础功能,但解决缓存穿透、缓存击穿和缓存雪崩等问题,更多的是依赖于,并结合 Redis 提供的特性来实现。

2025-06-04 17:14:38 853

原创 为什么要选择 DDD?它能带来哪些实际的好处

DDD 并非银弹,它也有学习曲线和实施成本。对于业务逻辑简单、生命周期短或者以数据CRUD操作为主的简单应用,引入DDD可能会带来不必要的复杂性(过度设计)。但对于那些真正需要解决复杂业务问题的系统,DDD 所带来的长期价值——选择领域驱动设计 (DDD),是因为它针对。——往往远超其初始投入。

2025-06-04 16:05:55 801

原创 DDD 的核心价值是什么?

来应对复杂业务带来的挑战,从而构建出高质量、高适应性的软件系统。DDD 的核心价值在于它提供了一套系统性的方法,能够帮助团队。总结来说,DDD 的核心价值在于它提供了一种。的软件开发思维方式和实践框架,通过。

2025-06-04 15:34:39 403

原创 DDD 到底是什么? 它试图解决什么核心问题?

领域驱动设计(Domain-Driven Design, DDD)是一种。总而言之,DDD 通过一系列原则和模式,可以帮助我们构建出。的复杂软件系统,其核心在于。

2025-06-03 17:04:20 723

原创 HttpServletResponse 对象用来做什么?

对象是由 Servlet 容器创建并传递给 Servlet 的 方法(以及间接传递给 , 等方法)的。它的核心作用是让 Servlet 能够向客户端(通常是浏览器)发送 HTTP 响应。通过 对象,我们可以:下面我们详细看看如何进行这些操作:状态码告诉浏览器请求的处理结果(例如,成功、未找到、服务器错误等)。方法:常量: 接口定义了很多常用的状态码常量,例如:示例:注意: 设置状态码或调用 / 应该在向响应体写入任何内容 之前 进行。响应头包含关于响应的元数据,例如内容类型、缓存控制、自定义信息等

2025-06-03 14:39:00 1129

原创 什么是无状态服务

每次客户端请求对于服务来说都是一个全新的、独立的交互,服务处理请求所需的所有信息要么包含在请求本身中,要么从外部共享存储(如数据库、缓存、消息队列等)中获取。总而言之,无状态服务是一种强大的架构模式,特别适用于构建可伸缩、高可用的云原生应用和微服务。它通过将状态管理从服务实例本身剥离,从而简化了服务的许多方面。无状态服务(Stateless Service)是一种设计理念,指的是。

2025-06-03 11:01:36 992

原创 Redis 缓存粒度如何控制?缓存整个对象还是部分字段?

选择缓存整个对象还是部分字段,是一个需要基于具体场景分析的权衡过程。理解每种方式的优缺点,并结合你的应用特性(数据大小、访问模式、更新频率、一致性要求等)来做出明智的选择。对于大型、字段更新频率差异大或常被部分访问的对象,缓存部分字段(尤其是使用 Redis Hash)是更优的选择。将对象的不同字段或字段组合存储在不同的 Redis Key 下,或者使用 Redis Hash 结构。控制 Redis 缓存粒度,即决定是缓存整个对象还是对象的部分字段,是一个需要在。之间进行权衡的决策。

2025-06-03 10:43:22 796

原创 如何合理设计缓存 Key的命名规范,以避免在共享 Redis 或跨服务场景下的冲突?

通过遵循上述规范和实践,我们可以有效的设计出合理的缓存 Key,从而在共享 Redis 或跨服务场景下最大程度的避免冲突,并提高系统的整体可维护性。设计合理的缓存 Key 命名规范对于避免冲突、提高可维护性和可读性至关重要,尤其是在共享 Redis 实例或跨服务调用的场景下。一个常见的、有效的 Key 结构可以包含以下部分,使用冒号。[项目/业务线前缀][可选的属性/版本]

2025-06-03 10:11:23 1291

原创 ServletComponentScan 注解的作用

这种方式的好处是你可以更细致地控制它们的属性(如顺序、初始化参数等),并且它们本身就是 Spring Bean,完全由 Spring 管理。它简化了配置,使得我们在开发过程中可以专注于业务逻辑,而不是繁琐的 XML 配置或编程式注册。注册的组件,它们主要是由 Servlet 容器直接管理,Spring Boot 提供了桥梁让容器能够发现它们,并辅助进行依赖注入。注解是 Spring Boot 提供的一个非常方便的注解,它的主要作用是。注解添加到你的主 Spring Boot 应用类上(即带有。

2025-05-31 16:58:24 867

原创 当 Redis 作为缓存使用时,如何保证缓存数据与数据库(或其他服务的数据源)之间的一致性?

当 Redis 作为缓存使用时,保证缓存数据与数据库(或其他数据源)之间的一致性是一个核心挑战。通常,我们追求的是“最终一致性”,而不是“强一致性”,因为强一致性往往会牺牲性能和可用性,这与使用缓存的初衷相悖。选择哪种策略取决于业务场景对一致性、性能、复杂度的具体要求。通常,一个组合策略(例如,Cache Aside + TTL + MQ/CDC 异步失效)能提供较好的平衡。这是最核心的部分,主要处理数据更新时如何让缓存失效或更新。

2025-05-30 14:53:05 1444

原创 mongoTempalte 什么是投影 (Projection)?如何只选择需要的字段返回?

选择哪种投影方式取决于你的具体需求、查询的复杂性以及你是否在使用 Spring Data Repositories。然而,在某些情况下,你可能希望将投影结果直接映射到一个更小的 DTO (Data Transfer Object) 类或接口,特别是当投影的字段集与原始实体差异很大时。Spring Data MongoDB 会尝试将投影后的结果映射回这个实体类,未被投影的字段会是。对于更复杂的投影需求,例如重命名字段、计算新字段、重塑文档结构等,聚合框架的。方法的第二个参数仍然是你的完整实体类 (如。

2025-05-30 11:17:52 826

原创 MongoTemplate 如何进行分页 (Pagination) 和排序 (Sorting)?

结合 Repository 和 Pageable,可以返回投影接口或 DTO 的分页结果。这是最推荐的方式,因为它更简洁,也符合 Spring Data 的设计理念。你需要分别获取数据列表和总数,然后手动构建。时,Spring Data MongoDB 会从。可以创建自己的工具类或服务方法来封装分页逻辑。这些接口提供了开箱即用的分页和排序方法,如。接口,可以非常方便地实现分页和排序功能。分页通常与排序结合使用。对象中提取以下信息并设置到。对象,或者使用辅助方法。

2025-05-30 11:11:05 604

原创 MongoTemplate 中如何构建复杂的查询条件 (Criteria API)?

Spring Data MongoDB 提供了强大的 Criteria API,允许我们以编程方式构建复杂的 MongoDB 查询条件。Criteria API 为构建 MongoDB 查询提供了非常灵活和强大的方式,几乎可以表达 MongoDB 支持的所有查询操作。查询所有 (年龄大于20且城市是"London") 或者 (是VIP客户且最近登录在过去7天内) 的用户。实例上链式调用多个条件时,它们默认是以 AND 关系应用于。默认情况下,如果你多次调用。,它们之间是 AND 关系。

2025-05-30 11:02:14 917

原创 如何利用 Spring Data MongoDB 进行地理位置相关的查询?

Spring Data MongoDB 可以通过方法名派生查询,或者使用。(或其他 GeoJSON 类型) 来存储位置信息。在你的实体类中,使用。

2025-05-26 17:07:37 1065

原创 在 Spring Boot 项目中如何合理使用懒加载?

在 Spring Boot 项目中,懒加载(Lazy Loading)是一种优化策略,它延迟对象的初始化或数据的加载,直到第一次实际需要使用它们时才进行。这可以显著提高应用程序的启动速度和减少不必要的资源消耗。下面分别讨论如何在这两个层面合理使用懒加载。

2025-05-26 16:54:05 1365

原创 什么是 Spring MVC 的异步请求处理?

传统的同步请求处理模型(Thread-Per-Request)中,每个请求都会占用一个 Servlet 容器线程,直到请求处理完成并返回响应。如果某个请求涉及到长时间的等待(例如,等待数据库查询、外部 API 调用),那么这个线程就会被阻塞,无法处理其他新的请求。总而言之,Spring MVC 的异步请求处理是一个强大的特性,它通过利用 Servlet 3.0+ 的异步能力,使得应用程序能够更有效地处理 I/O 密集型操作,从而提高整体性能和可伸缩性。,从而提高服务器的吞吐量和伸缩性。

2025-05-25 19:56:57 1038

原创 Spring Boot 项目中常用的 ORM 框架 (JPA/Hibernate) 在性能方面有哪些需要注意的点?

在 Spring Boot 项目中使用 JPA (Java Persistence API) / Hibernate (作为 JPA 的默认实现) 时,性能是一个非常关键的考量点。虽然 ORM 极大地简化了数据库交互,但如果不注意,很容易引入性能瓶颈。,可以在享受 ORM 便利的同时,构建出高性能的 Spring Boot 应用。我们要明白一点,没有银弹,需要根据具体的业务场景和数据特点进行权衡和优化。JPA/Hibernate 提供了强大的功能,但也隐藏了许多性能陷阱。关键在于理解其工作原理,特别是。

2025-05-25 11:38:22 1179 1

原创 HttpServletRequest 对象包含了哪些信息?

对象是由 Servlet 容器创建的,它封装了来自客户端(通常是浏览器)的 HTTP 请求的所有信息。当容器调用 Servlet 的service()方法(进而调用doGet()doPost()等)时,这个对象会作为参数传递进来。User-AgentAcceptCookieHost下面是如何从。

2025-05-25 11:33:09 1284

原创 如何映射 MongoDB 的 _id 字段?

在 Spring Data MongoDB 中,将 Java POJO 的字段映射到 MongoDB 文档的。在大多数 Spring Boot 应用中,使用。类型并让 MongoDB 自动生成。字段非常直接,主要通过 @Id。以下是映射 MongoDB。是最简单和最常见的做法。

2025-05-19 10:19:06 732

原创 如何在 MongoDB 中设计文档结构?与关系型数据库的表结构设计有何不同?

MongoDB 的文档设计是一个权衡的过程,没有一刀切的“正确”答案。最佳设计取决于具体的应用需求、数据访问模式、数据关系、性能要求和数据一致性要求。通常需要迭代的进行设计和优化。核心是理解嵌入和引用的优缺点,并根据你的应用场景做出明智的选择。在 MongoDB 中设计文档结构是一个核心且重要的环节,它直接影响应用的性能、可扩展性和可维护性。: 用户 (User), 文章 (Post), 评论 (Comment), 标签 (Tag)MongoDB 的核心思想是数据如何被应用访问,就如何存储它。

2025-05-19 10:15:06 1143

原创 HttpMessageConverter 的作用是什么? 它是如何实现请求体到对象、对象到响应体的自动转换的(特别是 JSON/XML)?

这个机制可以让我们开发者专注于业务逻辑,而不用关心数据格式转换的底层细节,大大提高了开发效率和代码的整洁性。如果需要支持新的数据格式,只需要实现并注册一个新的。(HTTP 消息转换器) 是 Spring MVC 框架中一个非常核心的组件,它的主要作用是在 HTTP 请求和响应体与 Java 对象之间进行双向转换。

2025-05-19 09:10:29 1262

原创 Spring MVC 如何处理文件上传? 需要哪些配置和依赖?如何在 Controller 中接收上传的文件 (MultipartFile)?

依赖: 添加和commons-io(如果使用配置: 在 Spring 配置中注册名为的bean (通常是或),并设置相关属性 (如大小限制)。Spring Boot 用户可以在中配置。HTML: 创建一个且的 HTML 表单,包含。Controller: 在 Controller 方法中使用(或) 来接收上传的文件。使用保存文件。安全不要信任的值来构建服务器上的文件路径;要清理它或生成唯一的文件名。验证文件类型 (MIME 和扩展名)。

2025-05-17 15:07:41 790

原创 Sprnig MVC 如何统一异常处理 (Exception Handling)?

注解的方法只能处理其所在 Controller 类内部抛出的异常。如果想在多个 Controller 之间共享异常处理逻辑,这种方式就不够高效。通过上述方式,我们可以将异常处理逻辑从业务代码中分离出来,使Controller 代码更简洁,并且能够为客户端提供友好的错误反馈。捕获时,应该返回的 HTTP 状态码。处理时,Spring MVC (通过。) 会自动返回 404 状态码,并将。用于标记一个方法,该方法将处理在。注解来指定当该异常被抛出且未被。抛出且没有被更具体的。抛出的特定类型的异常。

2025-05-16 19:46:21 1126

消息中间件常见面试题汇总

消息中间件常见面试题汇总

2025-03-12

RocketMQ 的安装与源码调试指南

RocketMQ 的安装与源码调试指南

2025-03-12

RocketMQ5安装与集群搭建

RocketMQ5安装与集群搭建

2025-03-12

年终述职模版合集(简约风格)

年终述职模版合集

2025-01-14

毕业论文标准模版使用技巧

毕业论文标准模版

2025-01-14

gradle 8.11版本

gradle 8.11版本

2025-01-13

mongo windows 命令行工具

mongo windows 命令行工具

2025-01-13

DMS windows版本

DMS windows版本

2025-01-07

nacos-server:2.2.3源码

nacos-server:2.2.3源码

2025-01-07

Word排版技巧

对 Word 进行页面调整,通常大家采用的方法是选择“文件→页面设置”,其实还有别的方法

2013-01-17

android 开发中用json解析客户端与服务器端的代码

游戏开发中客户端与服务器端数据的传输, URL url = new URL(path); //创建一个Url对象 //得到打开的链接对象 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求超时与请求方式 conn.setReadTimeout(5*1000); conn.setRequestMethod("GET"); //从链接中获取一个输入流对象 InputStream inStream = conn.getInputStream(); //调用数据流处理方法 byte[] data = StreamTool.readInputStream(inStream); String json = new String(data); //构建Json数组对象 JSONArray array = new JSONArray(json); //从Json数组对象读取数据

2011-09-26

android 中 ViewPager 与scrollView 冲突的解决

获取ViewPager 与 ScrollView 冲突事件的解决

2014-04-18

jackson-all-1.8.1.jar 包的下载

可以方便的把java 对象转换成json格式的数据

2013-11-25

andorid 开发USB 延长线与结点通信PC驱动

android 开发中,USB延长线连接开发板与PC之间的驱动

2013-01-17

androidasync-1.2.4.jar

使用androidasync-1.2.4.jar 包可方便的解析一些服务器端的数据格式

2014-02-17

fastjson-1.1.33.jar 下载

利用fastjson-1.1.33.jar 解析 json 数据

2014-01-11

android .9png 去黑边工具

android .9png 去黑边工具 xUltimate-d9pc-x86

2013-11-29

android switch 组件 4.0 以下的使用

android switch 组件 4.0 以下的使用

2014-01-11

三星pad(p6200)驱动

开发时一直找不到驱动,现在给大家分享一下,三星pad(p6200)驱动

2013-01-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除