自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

江南一点雨的专栏

专注Java一百年

  • 博客(873)
  • 资源 (55)
  • 收藏
  • 关注

原创 Spring Boot3,启动时间缩短 10 倍!

前面松哥写了一篇文章和大家聊了 Spring6 中引入的新玩意 AOT(见文章发出来之后,有小伙伴问松哥有没有做性能比较,老实说,这个给落下了,所以今天再来一篇文章,和小伙伴们梳理比较小当我们利用 Native Image 的时候,Spring Boot 启动性能从参数上来说,到底提升了多少。先告诉大家结论:启动速度提升 10 倍以上。

2024-01-31 22:18:45 2195

原创 和小伙伴们仔细梳理一下 Spring 国际化吧!从用法到源码!

国际化(Internationalization,简称 I18N)是指在 Java 应用程序中实现国际化的技术和方法。Java 提供了一套强大的国际化支持,使开发人员能够编写适应不同语言、地区和文化的应用程序。Java 国际化的主要目标是使应用程序能够在不同语言环境下运行,并提供相应的本地化体验。通过使用 Java 国际化的技术和组件,开发人员可以轻松地为 Java 应用程序提供多语言支持。

2023-11-23 10:23:33 252

原创 如何让 Bean 深度感知 Spring 容器

Spring 有一个特点,就是创建出来的 Bean 对容器是无感的,一个 Bean 是怎么样被容器从一个 Class 整成一个 Bean 的,对于 Bean 本身来说是不知道的,当然也不需要知道,也就是 Bean 对容器的存在是无感的。也就是说,虽然 Spring 中的 Bean 可以不用去感知 Spring 容器的存在,但是在实际开发中,我们往往还是需要 Spring 容器提供的各种能力,这样就迫使我们的 Bean 不得不去感知到 Spring 容器的存在。

2023-11-03 08:40:01 502

原创 Spring 冷知识:一个提前 AOP 的机会

今天再来聊一个 Spring 中的冷门知识:Bean 的处理不走正常流程,而是提前进行 AOP。本文算是前面文章()内容的一个补充,如果还没阅读前文,建议先阅读,这样有利于更好的理解本文。

2023-10-30 10:06:57 439 2

原创 Spring Bean 名称暗藏玄机,这样取名就不会被代理

一些使用小细节就是在不断的源码探索中逐步发现的,今天就来和小伙伴们聊一下通过 beanName 的设置,可以让一个 bean 拒绝被代理!

2023-10-24 11:44:15 170

原创 面试题解答:Spring Lifecycle 和 SmartLifecycle 有何区别?

当我们想在 Spring 容器启动或者关闭的时候,做一些初始化操作或者对象销毁操作,我们可以怎么做?注意我这里说的是容器启动或者关闭的时候,不是某一个 Bean 初始化或者销毁的时候~

2023-10-19 10:57:28 493

原创 @Scope 注解失效了?咋回事

这个用法也很简单,通过配置就可以设置一个 Bean 是否为单例模式。

2023-10-12 14:13:51 144

原创 Spring Boot 接口一个 JSON 字符串用两个对象去接收,这能行吗?

AbstractNamedValueMethodArgumentResolver 是一个抽象类,一些键值对类型的参数解析器都是通过继承它实现的,它里边定义了很多这些键值对类型参数解析器的公共操作。首先根据当前请求获取一个 NamedValueInfo 对象,这个对象中保存了参数的三个属性:参数名、参数是否必须以及参数默认值。

2023-10-10 10:41:34 287

原创 Spring AOP 中被代理的对象一定是单例吗?

今天我们来思考这样一个问题:在 Spring AOP 中,被代理的对象是单例的吗?当我们每次获取到代理对象的时候,都会重新获取一个新的被代理对象吗?还是被代理的对象始终是同一个?为什么要思考这个问题,因为在松哥接下来要讲的 @Scope 注解高级用法中涉及到这个知识点。

2023-10-08 11:26:41 134

原创 Spring 中三种 BeanName 生成器!

无论我们是通过 XML 文件,还是 Java 代码,亦或是包扫描的方式去注册 Bean,都可以不设置 BeanName,而 Spring 均会为之提供默认的 beanName,今天我们就来看看 Spring 中三种处理不同情况的 beanName 生成器。

2023-09-12 10:55:38 277

原创 Spring 条件注解没生效?咋回事

从 Spring4.0 开始,Spring 提供了一个更加细粒度的条件注解: ConfigurationCondition。从名字上就可以看出来这个是搭配 @Configuration 注解一起使用的,ConfigurationCondition 提供了一种更加细粒度的条件匹配,可以在配置或者 Bean 注册的时候去评估条件注解是否满足。在配置的时候评估,可能会导致当前类都不会被加载,在 Bean 注册的时候再去评估,意味着当前类就会被加载。

2023-09-11 11:41:05 266 2

原创 七种 BeanDefinition,各显其能!

AbstractBeanDefinition 是一个抽象类,它根据 BeanDefinition 中定义的接口提供了相应的属性,并实现了 BeanDefinition 中定义的一部分方法。BeanDefinition 中原本只是定义了一系列的 get/set 方法,并没有提供对应的属性,在 AbstractBeanDefinition 中将所有的属性定义出来了。后面其他的实现类也基本上都是在 AbstractBeanDefinition 的基础上完成的。

2023-09-08 09:11:21 307

原创 Spring Bean 别名处理原理分析

今天来和小伙伴们聊一聊 Spring 中关于 Bean 别名的处理逻辑。

2023-09-05 11:01:30 456

原创 FactoryBean 和它的兄弟SmartFactoryBean!

在这篇文章中,松哥也和各位小伙伴演示了了 FactoryBean 的一些具体用法,但是关于 FactoryBean 的一些具体实践,这篇文章中没有讲,那么今天我就来和大家聊一聊这个话题,顺便再来说说 FactoryBean 的兄弟 SmartFactoryBean。

2023-08-31 11:44:57 166

原创 一道经典面试题:@Configuration 和 @Component 有何区别?

无论小伙伴们之前是否背过相关的面试题,今天这篇文章学完之后相信大家对这个问题都会有更深一层的理解,废话不多少,咱们开始分析。

2023-08-29 11:44:04 404

原创 @Configuration 注解的 Full 模式和 Lite 模式!

Configuration 注解相信各位小伙伴经常会用到,但是大家知道吗,这个注解有两种不同的模式,一种叫做 Full 模式,另外一种则叫做 Lite 模式。这两种不同的模式在使用时候的表现完全不同,今天松哥就来和各位小伙伴捋一捋这两种模式。

2023-08-28 10:56:34 229

原创 似懂非懂的 AspectJ

今天想和小伙伴们聊一下我们在使用 Spring AOP 时,一个非常常见的概念 AspectJ。

2023-08-25 11:40:29 202

原创 Spring 中 @Primary 注解的原理是什么?

现在就去遍历 candidates,在遍历的时候,调用 isPrimary 方法去判断这个 BeanDefinition 上是否含有 @Primary 注解,isPrimary 方法的逻辑比较简单,我就不啰嗦了,该方法中涉及到 getMergedLocalBeanDefinition 方法去父容器中查找两个细节,这个松哥在之前的文章中也都和大家聊过了(虽然 @Priority 注解可以加在类上,也可以加在方法上,但是在具体实践中,加在方法上这个注解并不会生效,只能加在类上面。

2023-08-21 11:45:42 613

原创 Spring BeanDefinition 也分父子关系?

在 Spring 框架中,BeanDefinition 是一个核心概念,用于定义和配置 bean 的元数据,虽然在实际应用中,我们一般并不会或者很少直接定义 BeanDefinition,但是,我们在 XML 文件中所作的配置,以及利用 Java 代码做的各种 Spring 配置,都会被解析为 BeanDefinition,然后才会做进一步的处理。

2023-08-16 15:27:20 183

原创 Spring 中 @Qualifier 注解还能这么用?

这样也是一个问题解决办法。

2023-08-14 11:18:13 2287

原创 透过源码,捋清楚循环依赖到底是如何解决的!

这里我比较在意的有两个地方,一个是调用 addSingletonFactory 方法向三级缓存中添加回调函数,回调函数是 getEarlyBeanReference,如果有需要,将来会通过这个回调提前进行 AOP,即使没有 AOP,就是普通的循环依赖,三级缓存也是会被调用的,这个大家继续往后看就知道了,就这样一个简单的循环依赖,默认情况下,A 会被先加载,然后在 A 中做属性填充的时候,去创建了 B,创建 B 的时候又需要 A,就会从缓存中拿到 A,大致流程如此,接下来我们结合源码来验证一下这个流程。

2023-08-09 11:30:03 247

原创 Spring 容器原始 Bean 是如何创建的?

以下内容基于 Spring6.0.4。这个话题其实非常庞大,我本来想从 getBean 方法讲起,但一想这样讲完估计很多小伙伴就懵了,所以我们还是一步一步来,今天我主要是想和小伙伴们讲讲 Spring 容器创建 Bean 最最核心的 createBeanInstance 方法,这个方法专门用来创建一个原始 Bean 实例。松哥这里就以 Spring 源码中方法的执行顺序为例来和小伙伴们分享。

2023-08-02 11:09:50 655

原创 Spring AOP 中的代理对象是怎么创建出来的?

小伙伴们看一下,这里就是先按照类去匹配,匹配通过则继续按照方法去匹配,方法匹配器要是设置的 true,那就直接返回 true 就行了,否则就加载当前类,也就是 targetClass,然后遍历 targetClass 中的所有方法,最后调用。关于第二个 if 我多说一句,如果这里进来的是一个切面的 Bean,例如第一小节中的 LogAspect,这种 Bean 显然是不需要代理的,所以会在第二个方法中直接返回,如果是其他普通的 Bean,则第二个 if 并不会进来。

2023-07-31 10:55:50 954

原创 听说 Spring Bean 的创建还有一条捷径?

小伙伴们看一下,这里有一个判断条件,mbd.isSynthetic 是判断是否是一个合成 Bean,这种一般都是 Spring 定义的,我们自定义的 Bean 一般都不属于这一类,然后后面的 hasInstantiationAwareBeanPostProcessors 方法则是判断当前是否存在 InstantiationAwareBeanPostProcessor 类型的后置处理器,如果存在,则进入到 if 分支中。那么 resolveBeforeInstantiation 方法存在的意义是什么呢?

2023-07-28 17:02:49 529

原创 Spring AOP 中,切点有多少种定义方式?

这应该是是小伙伴们日常工作中使用最多的两种切点定义方式了。但是除了这两种还有没有其他的呢?今天松哥就来和大家聊一聊这个话题。

2023-07-27 09:59:42 800

原创 Spring 中一个少见的引介增强 IntroductionAdvisor

说白了,就是在生成代理对象的时候,把我们在 Advisor 中设置好的接口也考虑进去,这样生成的代理对象同时也是该接口的实现类,当然,在我们提供的 Advice 中,必须也要实现该接口,否则代理对象执行接口中的方法,找不到具体实现的时候就会报错了。这就是大家比较熟悉的 JDK 动态代理了,可以看到,生成的代理对象有五个接口,生成的代理对象不仅仅是 Dog、Animal 的实例,也是 SpringProxy 等的实例。我们就从 buildProxy 方法开始看起吧,这个方法看名字就知道是用来构建代理对象的。

2023-07-24 11:11:51 534

原创 玩一玩编程式 AOP

这个属性作用也是类似,我们平时在使用 AOP 的时候,有时候也会设置这个属性,这个属性如果设置为 true,则会进入到 if 分支中,但是 if 分支中的 if 则不宜满足,所以一般情况下,如果这个属性设置为 true,就意味着无论是否有接口,都使用 CGLIB 动态代理。这个方法是判断是否需要优化。关于直接使用 JDK 创建动态代理对象和直接使用 CGLIB 创建动态代理对象的代码我就不做过多介绍了,这些都是基本用法,松哥在之前录制的免费的 SSM 入门教程中都和小伙伴们讲过了,这里就不啰嗦了。

2023-07-21 19:23:53 267 1

原创 @Lazy 注解为啥就能破解死循环?

以下内容基于 Spring6.0.4。松哥和大家聊了在 Spring 中并非所有的循环依赖都可以被解决,有一些循环依赖默认情况下 Spring 也是完全无法解决的。不熟悉的小伙伴可以先看看。以第一小节的案例为例,在构造方法中互相注入对方的 Bean,此时完全就是一个死循环呀,对于这种死循环,难道真的有办法解决?Spring 里边提供了办法来解决,但是似乎又没有解决,为什么这么说,看完本文你就明白了。

2023-07-20 10:16:59 227

原创 Spring 能解决所有循环依赖吗?

以下内容基于 Spring6.0.4。看了的小伙伴,对于 Spring 解决循环依赖的思路应该有一个大致了解了,今天我们再来看一看,按照介绍的思路,有哪些循环依赖 Spring 处理不了。严格来说,其实也不是解决不了,所有问题都有办法解决,只是还需要额外配置,这个不是本文的主题,松哥后面再整文章和小伙伴们细聊。

2023-07-18 15:14:14 1731 2

原创 如何通过三级缓存解决 Spring 循环依赖

首先,什么是循环依赖?AService 和 BService 互相依赖:这个应该很好理解。

2023-07-17 15:15:18 1244 1

原创 @Autowired 到底是怎么把变量注入进来的?

接下来回到本小节一开始的源码中,处理完集合之后,接下来也是调用 findAutowireCandidates 方法去查找满足条件的 Bean,但是这个方法查找出来的 Bean 可能有多个,如果存在多个,则要通过 @Primary 注解或者其他优先级顺序,去确定到底使用哪一个(执行 determineAutowireCandidate 方法),如果查找到一个 Bean,那就把找到的 Bean 返回即可。如果不是候选类则返回一个空的 InjectionMetadata 对象,否则就继续后面的流程。

2023-07-14 10:09:00 435 1

原创 用 Spring 管理 Controller,你觉得可行吗?

中的分析,所有 Bean 都注册到 Spring 容器之后,Spring 容器作为父容器,SpringMVC 作为子容器,按理说,由于子容器可以访问父容器中的 Bean,所以 SpringMVC 是可以正常访问 Spring 容器中的 Bean 的,所以,似乎把所有的 Bean 都扫描到 Spring 容器应该是没有问题的?所以,如果把 Controller 让 Spring 容器扫描并管理,那么就会导致在默认情况下,SpringMVC 容器找不到 Controller,进而导致所有的请求 404。

2023-07-13 10:27:35 241

原创 Spring 中的父子容器是咋回事?

当使用了父子容器之后,如果去父容器中查找 Bean,那么就单纯的在父容器中查找 Bean;需要注意的是,上面这种结构中,子容器可以获取到 parent 的 Bean,但是无法获取到兄弟容器的 Bean,即如果 consumer 中引用了 merchant 中的 Bean,那么上面这个配置就有问题了。相信有小伙伴也听说过,在 SSM 项目中,Spring 容器是父容器,SpringMVC 是子容器,子容器可以访问父容器的 Bean,但是父容器不能访问子容器的 Bean。父子容器的优势是什么?

2023-07-12 10:07:58 437

原创 Spring5 中更优雅的第三方 Bean 注入

接下来松哥就来和大家简单聊一聊这个话题。

2023-07-11 10:14:00 306

原创 一道经典面试题:BeanFactory 和 FactoryBean 有何区别?

这也是 Spring 面试时一道经典的面试问题,今天我们来聊一聊这个话题。区别在于,BeanFactory 是 Spring 框架的核心接口,用于管理和提供 Bean 实例,而 FactoryBean 是一个特殊的 Bean,用于创建和管理其他 Bean 的实例。FactoryBean 在 Bean 的创建过程中提供更多的自定义能力,允许进行额外的逻辑处理。可能有的小伙伴看的还不是很清楚,我们再来详细看下。

2023-07-06 15:53:42 311

原创 BeanFactoryPostProcessor 和 BeanPostProcessor 有什么区别?

研究 Spring 源码的小伙伴可能会发现,Spring 源码中有很多名称特别相近的 Bean,我就不挨个举例了,今天我是想和小伙伴们聊一聊 Spring 中 BeanFactoryPostProcessor 和 BeanPostProcessor 两个处理器的区别。我将从以下几个方面来和小伙伴们分享。

2023-07-05 15:15:11 539

原创 Spring Security6 全新写法,大变样!

自定义 JSON 登录也和之前旧版不太一样了。小伙伴们知道,Spring Security 中默认的登录接口数据格式是 key-value 的形式,如果我们想使用 JSON 格式来登录,那么就必须自定义过滤器或者自定义登录接口,下面松哥先来和小伙伴们展示一下这两种不同的登录形式。Spring Security 默认处理登录数据的过滤器是 UsernamePasswordAuthenticationFilter,在这个过滤器中,系统会通过。

2023-06-14 18:11:38 3063

原创 delete 清空表之后,磁盘空间未发生变化?

结尾和小伙伴们留了一个小问题,就是关于命令,今天我想花点时间再来和小伙伴们聊一聊这个话题。

2023-06-07 15:59:57 960

原创 什么时候 MySQL 查询会变慢?

前面几篇文章和小伙伴们聊的基本上都是从索引的角度去优化 MySQL 查询,然而,索引创建的好,并不意味着查询就一定快,影响查询效率的因素特别多,今天我们就来聊一聊这些可能影响到查询的因素。

2023-06-07 09:25:56 775

原创 Spring Boot 启动注解分析

其实松哥之前和小伙伴们聊过相关的问题,不过都是零散的,没有系统梳理过,之前也带领小伙伴们自定义过一个 starter,相信各位小伙伴对于 starter 的原理也有一定了解,所以今天这篇文章一些过于细节的内容我就不赘述了,大家可以翻看之前的文章。由于我们项目中的自动化配置类特别多,每一个自动化配置类都会依赖别的类,当别的类存在时,这个自动化配置类才会生效,这一堆互相之间的依赖关系,存在于。这里源码的方法命名都做的不错,基本上都能做到见名知意,小伙伴们日常开发中,应该向这样的命名思路看齐。

2023-06-02 17:43:59 748

Android开发中线程池的使用Demo

Android开发中线程池的使用Demo,详情见博客http://blog.csdn.net/u012702547/article/details/52259529

2016-08-20

Dagger2中Scope使用Demo

Dagger2中@Scope注解的使用,详见博客http://blog.csdn.net/u012702547/article/details/52213706

2016-08-15

Dagger2Demo

Dagger2使用Demo,详情见博客http://blog.csdn.net/u012702547/article/details/52200927

2016-08-14

ButterKnife使用Demo

Android注解框架ButterKnife使用Demo,详情见博客http://blog.csdn.net/u012702547/article/details/52194594

2016-08-12

Android模拟登录知乎

Android模拟登录知乎,Cookie持久化,具体请看我的博客:http://blog.csdn.net/u012702547/article/details/52156315

2016-08-09

DataBindingDemo3

Android开发中的数据绑定DataBindingDemo3,具体请看我的博客http://blog.csdn.net/u012702547/article/details/52077515

2016-07-31

DataBindingDemo2

Android开发中的数据绑定DataBindingDemo,具体请看我的博客http://blog.csdn.net/u012702547/article/details/52077515

2016-07-31

DataBindingDemo

Android开发中的数据绑定DataBindingDemo,具体请看我的博客http://blog.csdn.net/u012702547/article/details/52077515

2016-07-31

zxing的aar包

详情见博客http://blog.csdn.net/u012702547/article/details/51501350

2016-05-26

Android在线视频播放器Demo

Android在线视频播放器Demo,详见http://blog.csdn.net/u012702547/article/details/51317709

2016-05-04

Android自定义View值ProgressBar

Android自定义View值ProgressBar,详情请看http://blog.csdn.net/u012702547/article/details/51290266

2016-05-01

android自定义View之NotePad出鞘记

android自定义View之NotePad出鞘记,自定义NotePad,android自定义笔记本

2016-04-25

android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索

android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索

2016-04-24

Android中Dialog使用详解

android中AlertDialog使用详解,详细请看我的个人博客http://blog.csdn.net/u012702547/article/details/50676606

2016-02-16

ImageView的scaleType属性练习

ImageView的scaleType属性练习,具体请查看我的博客http://blog.csdn.net/u012702547/article/details/50586946

2016-01-26

snackbar使用Demo

snackbar使用demo,详情见博客http://blog.csdn.net/u012702547/article/details/50284355

2015-12-13

导航栏Demo

TabLayout使用Demo,详情见博客http://blog.csdn.net/u012702547/article/details/50273523

2015-12-12

android文件存储源码及笔记

android文件存储工具类及相关笔记,详情请查看博客http://blog.csdn.net/u012702547/article/details/50269639

2015-12-12

自定义ContentProvider

自定义ContentProvider的一个Demo,详情查看我的博客http://blog.csdn.net/u012702547/article/details/50193087

2015-12-06

GitForWindows2.6.3

由于众所周知的原因,下载该文件网速非常差,这里下载好了,大家可以直接下载。详情请见http://blog.csdn.net/u012702547/article/details/50129773

2015-12-01

flowable实战教程.pdf

251页原创flowable实战教程

2022-12-14

Spring入门.pdf

江南一点雨原创 Spring 入门教程,更多 Spring教程请关注我的 CSDN 博客:https://blog.csdn.net/u012702547

2020-02-17

SpringMVC 入门教程.pdf

江南一点雨原创 SpringMVC 入门教程,更多 SpringMVC教程请关注我的 CSDN 博客:https://blog.csdn.net/u012702547

2020-02-17

MyBatis入门教程

江南一点雨原创 MyBatis 入门教程,更多 MyBatis教程请关注我的 CSDN 博客:https://blog.csdn.net/u012702547

2020-02-17

Spring Boot2 教程.pdf.zip

江南一点雨原创 Spring Boot2 教程合集。更多Spring Boot2资料可以关注我的 CSDN博客https://blog.csdn.net/u012702547

2020-02-17

GitHub入门与实践

GitHub入门与实践,GitHub入门与实践 是本人花钱买的电子版。是一个带你入门Github的优秀书籍。此PDF带完整书签。此次上传 纯属赚点csdn积分。

2017-10-16

websocket使用案例

websocket使用入门案例,详情请见博客http://blog.csdn.net/u012702547/article/details/77655826

2017-08-28

dubbo入门案例-参考官方文档

dubbo入门案例,详情见博客http://blog.csdn.net/u012702547/article/details/77601538

2017-08-26

dubbo入门案例参考

dubbo的一个入门案例,主要参考了官方文档,详情见博客http://blog.csdn.net/u012702547/article/details/77601538

2017-08-26

Ajax上传文件Demo

Ajax上传文件Demo以及Ajax上传文件前的预览效果实现。详情见博客http://blog.csdn.net/u012702547/article/details/77585111

2017-08-25

SpringSession+Redis实现Session共享案例

SpringSession+Redis实现Session共享案例,详情请看http://blog.csdn.net/u012702547/article/details/72991283

2017-06-10

省市县三级联动数据库

省市县三级联动数据库,文件是导出的SQL语句,下载后直接执行即可。

2017-04-27

Java单元测试相关的两个jar包

Java单元测试相关的两个jar包

2017-01-13

Binder详解Demo

Binder详解Demo,详见博客http://blog.csdn.net/u012702547/article/details/52748403

2016-10-07

AIDL使用DEMO

AIDL使用DEMO,详情见博客http://blog.csdn.net/u012702547/article/details/52747989

2016-10-07

SQLBrite使用Demo

SQLBrite使用Demo,详见博客http://blog.csdn.net/u012702547/article/details/52577403

2016-09-18

干货集中营App

干货集中营App,详见博客:http://blog.csdn.net/u012702547/article/details/52566120

2016-09-17

Retrofit使用Demo

retrofit使用Demo,详见博客http://blog.csdn.net/u012702547/article/details/52143090#comments

2016-09-13

ViewPager之PageTransformer属性使用Demo

ViewPager之PageTransformer属性使用Demo,详情见博客http://blog.csdn.net/u012702547/article/details/52334161

2016-08-28

Android5.0水波纹效果Demo

Android5.0水波纹效果Demo,详见博客http://blog.csdn.net/u012702547/article/details/52325418

2016-08-26

空空如也

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

TA关注的人

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