自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

xiaolyuh的专栏

凡是过去,皆为序幕

  • 博客(417)
  • 资源 (53)
  • 收藏
  • 关注

原创 StackOverflowError 栈溢出实战

栈溢出的原因在解决栈溢出问题之前,我们首先需要知道一般引起栈溢出的原因,主要有以下几点:是否有递归调用,循环依赖调用是否有大量循环或死循环全局变量是否过多局部变量过大,如:数组、List、Map数据过大问题现象我们一个很老的接口(近一年没有动过)在线上运行一段时间后报了StackOverflowError栈溢出,其他接口又能正常提供服务,错误日志:java.lang.Stack...

2019-11-28 11:37:47 2205 1

原创 Mybatis 源码(六)Mybatis-Spring框架实现原理

我在使用mybatis-spring过程中一直有一个疑问,在Mybatis 源码(一)总揽中我提到过,SqlSession和Mapper对象的声明周期是方法级别的,也就是每个请求的SqlSession和Mapper对象是不一样的,是一个非单例的Bean。但是与Spring集成后,为什么我们可以直接注入Mapper对象,如果通过直接注入的话Mapper对象却成了单例的了?我们带着疑问来看下Myba...

2019-11-28 11:35:47 389

原创 Mybatis 源码(五)Mybatis 中的数据读写

数据读写的本质不管是哪种ORM框架,数据读写其本质都是对JDBC的封装,其目的主要都是简化JDBC的开发流程,进而让开发人员更关注业务。下面是JDBC的核心流程:注册 JDBC 驱动(Class.forName(“XXX”);)打开连接(DriverManager.getConnection(“url”,“name”,“password”))根据连接,创建 Statement(conn....

2019-11-28 11:35:01 316

原创 Mybatis 源码(四)Mybatis Excuter框架

我们在上一章介绍到,Mybatis会将所有数据库操作转换成iBatis编程模型,通过门面类SqlSession来操作数据库,但是我们深入SqlSession源码我们会发现,SqlSession啥都没干,它将数据库操作都委托给你了Excuter,如图:Excuter框架类图BaseExecutor在BaseExecutor定义了Executor的基本实现,如查询一级缓存,事务处理等不变的...

2019-11-28 11:34:02 356

原创 Mybatis 源码(三)Mybatis 代理模块

在使用Mybatis的时候大家可能都有一个疑问,为什么只写Mapper接口就能操作数据库?它的主要实现思想是:使用动态代理生成实现类,然后配合xml的映射文件中的SQL语句来实现对数据库的访问。Mybatis编程模型Mybatis是在iBatis上演变而来ORM框架,所以Mybatis最终会将代码转换成iBatis编程模型,而 Mybatis 代理阶段主要是将面向接口编程模型,通过动态代理转...

2019-11-28 11:33:22 258

原创 Mybatis 源码(二)Mybatis 初始化

Mybatis 初始化是由SqlSessionFactoryBuilder来完成的,主要的工作解析XML文件,并将解析的类容封装到Configuration类中,最后将Configuration类封装到SqlSessionFactory中并返回,自此初始化完成。完成对XML文件解析的是XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder三个类...

2019-11-28 11:32:45 275

原创 Mybatis 源码(一)总揽

整体架构这只是MySql的一个逻辑划分架构。接口层:通SqlSession类提供对数据库访问能力,隐藏了后续复杂的处理逻辑。核心处理层:主要负责执行SQL,并返回结果。基础支撑层:对一些基础功能进行封装,为核心处理层提供服务。代码结构Mybatis的代码结构非常工整,堪称完美的java编程规范教科书,当我们深入源码我们会发现,Mybatis的注释量相当少,那是因为基本上我们可以...

2019-11-28 11:32:03 313

原创 Mybatis 配置详解

完整配置mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><confi...

2019-11-28 11:31:25 309

原创 JDBC 核心要点

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。初始化H2数据库public class BaseTest { protected ...

2019-11-28 11:29:24 262 1

原创 mybatis-plus 2.x升级3.x注意点

2.0到3.0主要升级的点:升级 JDK 8 + 优化性能 Wrapper 支持 lambda 语法模块化 MP 合理的分配各个包结构重构注入方法,支持任意方法精简注入模式全局配置下划线转换消灭注入 AS 语句改造 Wrapper 更改为 QueryWrapper UpdateWrapper重构 分页插件 消灭固定分页模型,支持 Mapper 直接返回 IPage 接口新增 Res...

2019-11-28 11:28:16 3528 3

原创 Spring 源码(十一)Spring流程汇总

Spring 容器初始化流程Spring 容器初始化流程大致流程如下:this():注册内置的BeanPostProcessor的BeanDefinition到容器register(annotatedClasses):注册配置类 BeanDefinition 到容器prepareRefresh():初始化前的准备工作,列如对系统属性或者环境变量进行验证obtainFreshBeanF...

2019-11-28 11:20:33 751

原创 Spring 源码(十)Spring Aware自动装配原理

Spring Aware自动装配有两种实现方式:在初始化Bean的initializeBean方法中执行invokeAwareMethods方法通后置处理器ApplicationContextAwareProcessor来实现的,它实现了BeanPostProcessor接口invokeAwareMethods我们在初始化Bean的时候,为了保证一部分Aware必须在后置处理器post...

2019-11-28 11:19:37 461

原创 Spring 源码(八)循环依赖源码解析

循环依赖是指两个或者多个Bean之前相互持有对方。在Spring中循环依赖一般有三种方式:构造函数循环依赖setter方法循环依赖prototype 范围的依赖处理构造函数循环依赖在Spring中构造函数循环依赖是无法解决的,因为构造函数依赖其实是方法间循环调用的一种,会发生死循环。但是在Spring中会直接抛出BeanCurrentlyInCreationException异常。源...

2019-11-28 11:18:36 381 1

原创 Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配)

@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程。通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的。AutowiredAnnotationBeanPostProcessor 类图PriorityOrdered:确认 AutowiredA...

2019-11-28 11:17:14 1497

原创 Spring 源码(七)Spring 事务源码解析

注册后置处理器开启对事务的支持@EnableTransactionManagement@EnableTransactionManagement注解的主要作用是开启对事务的支持,源码如下:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementC...

2019-11-28 11:13:57 352

原创 Cglib 与 JDK动态代理

AOP 代理的两种实现:jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到;cglib是子类,private的方法照样不会出现在子类里,也不能被拦截。JDK 动态代理。具体有如下四步骤:通过实现 InvocationHandler 接口创建自己的调用处理器;通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;通过...

2019-11-28 11:13:11 421

原创 Spring 源码(六)Spring AOP源码解析

AOP 面向切面编程,相对于OOP面向对象编程。Spring AOP存在的目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承只能是单继承,阻碍更多的行为添加到一组类上,AOP弥补了OOP的不足。Spring支持AspectJ的注解式切面编程,基本定义如下:使用@AspectJ声明一个切面。使用@After、@Be...

2019-11-28 11:12:22 562

原创 Spring 源码(五)初始化所有单例Bean,并注册到容器(Bean的生命周期)

在这之前我们先来看下refresh()方法,它完整的描述了整个ApplicationContext的初始化过程。这里看起来更像是对容器进行初始化的模板或者提纲。@Overridepublic void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonit...

2019-11-28 11:11:13 339

原创 Spring 源码(四)解析配置类

我们要找出所有符合条件的业务Bean,首先我们需要知道在Spring中什么样的Bean是符合条件的,是需要容器来管理的:使用组件标注注解的Bean(@Controller、@Service、@Repository、@Component),一般项目里面使用。使用@Bean注解标准的方法,一般导入第三方组件的时候使用。使用@Import注解导入的Bean,一般快速导入一批组件时使用。doP...

2019-11-28 11:09:20 275

原创 Spring 源码(三)注册配置类 BeanDefinition 到容器

调用链路:registerBeanDefinition:861, DefaultListableBeanFactory (org.springframework.beans.factory.support)registerBeanDefinition:315, GenericApplicationContext (org.springframework.context.support)reg...

2019-11-28 11:08:13 268

原创 Spring 源码(二)注册内置的BeanPostProcessor的BeanDefinition到容器

发起注册调用链路:registerAnnotationConfigProcessors:163, AnnotationConfigUtils (org.springframework.context.annotation)registerAnnotationConfigProcessors:134, AnnotationConfigUtils (org.springframework.con...

2019-11-28 11:06:28 357

原创 Spring 源码(一)Spring 容器的入口

Spring 容器的初始化ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);当我们完成一个ApplicationContext的实例化时就完成了Spring容器的初始化,而AnnotationConfigApplicationContext的构造方法也就是Spring容器的入...

2019-11-28 11:05:06 562

原创 Spring Bean 的初始化和销毁的三种方式(Spring Bean 的生命周期)

Spring 容器中的 Bean 是有生命周期的,Bean 的生命周期是指 Bean 创建----> 初始化----> 销毁 的过程,并且 Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。 下面是常用的三种指定特定操作的方法:通过 元素的init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;通过实现Ini...

2019-11-28 11:04:22 489

原创 Spring 核心注解

@Configuration 配置类注解声明一个类是配置类,等同于配置文件中的applicationcontext.xml。加载Spring配置的两种方式:ClassPathXmlApplicationContext XML方式ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext....

2019-11-28 11:03:29 594 1

原创 Spring Bean 的注册和注入的几种常用方式和区别

Spring 注册Bean:包扫描 + 组件标注注解(@Controller、@Service、@Repository、@Component),一般项目里面使用。使用@Bean注解,一般导入第三方组件的时候使用。使用@Import注解,一般快速导入一批组件时使用。使用FactoryBean接口 + @Bean注解。包扫描 + 组件标注注解(@Controller、@Service、@...

2019-11-28 11:02:47 1824 1

原创 Spring 模块介绍

一、核心容器(Core Container)Spring-Core:核心工具类,Spring其他模块大量使用Spring-Core。Spring-Beans:Spring定义Bean的支持。Spring-Context:运行时Spring容器。Spring-Context-Support:Spring对第三方包的集成支持。Spring-Expression:使用表达式语言在运行时查询...

2019-11-28 11:01:53 232

原创 Java中的指令重排

在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3种类型:编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。内存系统的重排序。...

2019-11-28 10:57:20 6685 6

原创 Java内存模型

线程之间的通信和同步线程之间的通信和同步是并发编程领域的关键问题。线程之间的通信通信是指线程之间以何种机制来交换信息。线程之间的通信一般有两种方式:共享内存和消息传递。在java中典型的消息传递方式就是wait()和notify()。线程之间的同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线...

2019-11-28 10:56:43 147

原创 线程安全的单例模式

懒汉式加方法锁public class Singleton { private static Singleton singleton = null; private Singleton() { } public static synchronized Singleton getInstance() { if (Objects.isNull(s...

2019-11-28 10:56:06 175

原创 并发情况如何提升同步代码块的性能

使用并发编程的目标是为了提升系统性能,引入多线程后,其实会引入额外的开销,如线程之间的协调、增加的上下文切换,线程的创建和销毁,线程的调度等等。过度或不恰当的使用,可能会导致多线程程序性能甚至比单线程还要低。影响性能的因素上下文切换是指CPU 从一个进程或线程切换到另一个进程或线程。一次上下文切换花费5000~10000个时钟周期,几微秒。在上下文切换过程中,CPU会停止处理当前运行的程序,...

2019-11-28 10:55:20 434

原创 并发安全

在并发的情况下使用和调度一个类,这个类总是能表现出正确的行为,那么我们就说这个类是并发安全的类。类线程安全的表现为: 操作的原子性和内存的可见性。怎么才能做到类的线程安全栈封闭所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态。无状态没有任何成员变量的类,就叫无状态的类让类不可变我们常见的不可变类有:String,包装类,LoacalDateTime。让状态不可变,两种方式...

2019-11-28 10:28:59 224

原创 CompletionService 源码解析

CompletionService的主要作用是:按照异步任务的完成顺序,逐个获取到已经完成的异步任务。主要实现是在ExecutorCompletionService中。类图核心内部类private class QueueingFuture extends FutureTask<Void> { QueueingFuture(RunnableFuture<V> tas...

2019-11-28 10:12:14 249

原创 CompletableFuture 组合式异步编程

CompletableFuture是jdk1.8引入的一个新特性。 它主要是为了解决多个Future结果之间的依赖关系。比如:将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果。等待Future集合中的所有任务都完成。仅等待Future集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。通过编程方式完成一个Fu...

2019-11-28 10:11:36 271

原创 FutureTask 源码解析

Future接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给 Executor执行,也可以由调用线程直接执行(FutureTask.run())。类图核心属性/** * * Possible state transitions: * NEW -&gt...

2019-11-28 10:04:12 311

原创 JAVA中常见的线程池

Executor框架最核心的类是ThreadPoolExecutor,它是线程池的实现类,详情请看ThreadPoolExecutor 源码解析。Executors还为我们提供了4种常见的线程池,他们都是基于ThreadPoolExecutor而来,还有一个是WorkStealingPool是基于ForkJoinPool的。FixedThreadPool使用方式ExecutorService...

2019-11-28 10:03:39 386

原创 ThreadPoolExecutor 源码解析

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。合理地使用线程池能够带来3个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分...

2019-11-28 10:02:28 410

原创 JAVA并发容器-写时复制容器

写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以写时复制容器也是一种读写分离的思想,读和写不同的容器。如果读的时候有多个线程正在向容器添加数据,读还是会读...

2019-11-28 10:00:49 545

原创 JAVA并发容器-ConcurrentSkipListMap,ConcurrentSkipListSet

ConcurrentSkipListMap其实是TreeMap的并发版本。TreeMap使用的是红黑树,并且按照key的顺序排序(自然顺序、自定义顺序),但是他是非线程安全的,如果在并发环境下,建议使用ConcurrentHashMap或者ConcurrentSkipListMap。ConcurrentSkipListSet其实是TreeSet的并发版本。TreeSet底层使用红黑树,并且按照k...

2019-11-28 10:00:04 506

原创 JAVA并发容器-阻塞队列

在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两 种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁 (入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方......

2019-11-28 09:58:28 263

原创 JAVA并发容器-ConcurrentLinkedQueue 源码分析

在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两 种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁 (入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。ConcurrentLinkedQueue是一个非阻塞的基于链表节点的无界线程安全队列,它遵循先进先出的原则,并采用...

2019-11-28 09:57:01 439 1

五子连珠源码

五子连珠源码,用java写的附源代码,记得好评哦

2012-08-28

3630个网页小图标

3630个网页小图标,各类网页图标,非常全面

2012-08-28

Java编程思想第四版完整中文高清版

Java编程思想第四版完整中文高清版,非常棒的一本书

2012-08-28

CAN总线驱动器

82C250是CAN控制器与物理总线之间的接口,它最初是为汽车中的高速应用而设计的。器件可以提供对总线的差动发送和接收功能。

2012-08-25

互联网新技术

互联网新技术,互联网基础,移动和无线网络,记得好评哈

2012-08-25

java输入输出

java输入输出,java中的重难点详解,记得好评哦

2012-08-25

大学生科学研究课题

大学生科学研究课题申报书_范例,很详细的

2012-08-25

photoshope_中文版教程

photoshope_中文版教程,很不错的photoshope教程,记得好评哦

2012-08-25

LIN_技术规范

LIN_技术规范及在汽车中的应用,LIN技术详解

2012-08-25

Java编程实验报告

Java编程基础实验报告(样本) 仅供参考 记得好评哦

2012-08-25

JAVA_split_用法

JAVA_split_用法,split详解,记得好评哦

2012-08-25

java实现控台通信

基于UDP协议的java通信,java网络编程

2012-08-25

Eclipse 技巧

Eclipse应用技巧-代码模板功能。非常全面,记得好评哦

2012-08-25

CoreJava笔记

java笔记,一个非常适合初学者学习的java文档。记录java精髓

2012-08-25

拼图游戏源码

拼图游戏源码,用java编写,仅供学习和参考,记得好评哦

2012-08-25

坦克大战源码

坦克大战源码,用java编写,记得好评哦

2012-08-25

java数据结构和算法

java数据结构和算法PDF版,很好的一本书,给大家分享一下

2012-08-25

java小闹钟

用java编写的闹钟程序,附带源码,转载

2012-08-25

晨枫聊天工具

刚刚学java的时候写的,基于UDP协议,还在完善中。设置你要通信的IP,如果你要群聊就将IP最后移位设置成255。语音和视屏功能还在写。

2012-08-25

打飞机源码

打飞机源码,实现选关,血量等等,适合java初学者学习。

2012-08-25

consul_1.7.3_windows\mac\linux.zip

微服务,注册中心,consul 1.7.3 Windows,linux,mac版。官网下载:consul_1.7.3_XXX_amd64。官网下载速度很慢,我才在这里分享一个资源。

2020-06-02

git-flow-plus-4idea-1.0.7.zip

MrtfGitFlow4Idea插件是一款基于mrtf-git-flow分支管理流程的Idea插件,它最主要的作用是用来简化分支管理流程,最大限度的防止误操作。

2020-05-07

ScreenToGif.rar

Screen to Gif是一款方便可靠的gif动画录制软件,可以用来快速录制屏幕上的指定区域,将其直接保存为GIF动画文件。 官网:http://www.screentogif.com/?l=zh_cn#

2020-03-13

logback 中文手册

此中文手册为官网手册中文版 文档版本 0.1 发布日期 2010年4月23日 原作者 Ceki Gülcü、Sébastien Pennec 中文版译者 陈华 联系方式: clinker@163.com 陈华的论坛地址:http://www.iteye.com/topic/655136

2017-03-30

jquery cookie 中文文档

jquery cookie 中文文档 1.4.0版本。 http://plugins.jquery.com/cookie/

2013-12-25

jQuery api 1.8 中文版.chm

jQuery api 1.8 中文版.chm 最新版的 还是中文的哈

2013-08-16

spring-data-jpa-reference API

spring框架中的持久层框架,讲的很全面

2013-08-16

javamail1.4.7

java邮件开发jar包。包括一些例子在里面。

2013-06-27

java媒体开发JMF包含,帮助文档,安装配置文档,初级教程,安装包

java媒体开发JMF包含帮助文档安装配置文档初级教程安装包

2012-08-31

JAVA反射机制

有详细的讲解和案例,希望对您有帮助,记得好评哦

2012-08-31

mysql-5.0.75.tar.gz

mysql-5.0.75.tar.gz tar -zxvf mysql-5.0.75.tar.gz 就可以安装了

2012-08-26

Android从入门到精通.rar

Android从入门到精通.rar,一个非常不错的android教材,现在android很火的

2012-08-26

apache-tomcat-7.0.8.exe

apache-tomcat-7.0.8.exe ,和MyEclipse一起用非常稳定

2012-08-26

十天学会DIV+CSS(WEB标准

十天学会DIV+CSS(WEB标准),css样式表,加div布局,非常棒的一本书

2012-08-26

165个DIV_CSS网站模板源码.rar

165个DIV_CSS网站模板源码.rar,记得好评哦

2012-08-26

捕鱼达人源码

捕鱼达人源码,挺好玩的,如有不足敬请原谅

2012-08-25

java聊天室程序

java聊天室源码,是一个毕业设计,如有不足敬请原谅

2012-08-25

Microsoft_Web_Application_Stress_Tool

使用Microsoft_Web_Application_Stress_Tool对web进行压力测试

2012-08-25

汽车电子控制系统实例

汽车电子技术在汽车技术进步的过程中始终走在前列,汽油机电控喷射技术结合三元催化器、柴油机燃油喷射系统、自动变速器、智能可变气门正时和升程技术、混合动力技术等许多机、电、液紧密结合的技术使汽车和性能指标日益提高,特别是电子控制技术伴随着微电子工业的迅猛发展而迅速提高。

2012-08-25

CAN技术规范

这本技术规范的目的是为了在任何两个CAN仪器之间建立兼容性。可是,兼容性有不同的方面,比如电气特性和数据转换的解释。为了达到设计透明度以及实现柔韧性,CAN被细分为以下不同的层次

2012-08-25

空空如也

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

TA关注的人

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