- 博客(44)
- 资源 (17)
- 收藏
- 关注

原创 Spring源码系列(五)——@Aspect源码解析
首先我们看一下@Aspect的简单实例代码首先到Config类中添加@EnableAspectJAutoProxy注解打开AOP功能@ComponentScan(basePackages = "com.kennor.test")@EnableAspectJAutoProxypublic class Config {}自定义注解StudyTrainAnnotation用于标识连接点Joinpoint@Retention(RetentionPolicy.RUNTIME)@Target(Elem
2021-12-28 11:07:53
2718

原创 Spring源码系列(四)——Bean的循环依赖注入报错流程分析
上一篇文章我们介绍了Bean的实例化过程以及相互依赖注入的情况,本篇我们介绍一下循环依赖注入报错。首先我们要改一下StudentA和StudentB的代码,具体如下:可以看到在两个类中构造方法都注入了彼此,接着我们断点看一下代码的执行流程。首先执行到StudentA的doCreateBean此时缓存中没有StudentA实例,直接走到getSingleton方法然后走到方法中的beforeSingletonCreation方法将beanName保存在singletonsCurrentl
2021-12-24 15:58:26
783

原创 Spring源码系列(三)——Bean的实例化过程
上一篇文章我们已经介绍了Spring是如何将包路径下的类信息都扫描封装到BeanFactory中了,所以接下来我们着重看一下spring是如何通过BeanFactory创建Bean的实例。以我们示例代码中的StudentA为例,看看他的实例化过程是如何的@Overridepublic void preInstantiateSingletons() throws BeansException { // Iterate over a copy to allow for init methods
2021-12-24 15:48:43
861
1

原创 Spring源码系列(二)——@ComponentScan源码解析
首先看一下本次用到的简单的示例代码StudentA用@Component注解标识Config用@ComponentScan标识,扫描的基础包路径为:com.kennor.test最后Test运行的示例代码如下:public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config
2021-12-24 15:22:10
1732
原创 mybatis源码系列(七)—— 反射模块
首先看一下反射模块的核心类:ObjectFactory:MyBatis每次创建结果对象的新实例时,它都会使用对象工厂(ObjectFactory)去构建POJO;ReflectorFactory:创建Reflector的工厂类,Reflector是MyBatis反射模块的基础,每个Reflector对象都对应一个类,在其中缓存了反射操作所需要的类元信息;ObjectWrapper:对对象的包装,抽象了对象的属性信息,定义了一系列查询对象属性信息的方法,以及更新属性的方法;ObjectWrapperF
2022-01-01 16:43:59
676
原创 mybatis源码系列(六)—— Cache模块
首先整体看一下MyBatis中为我们提供的缓存功能相关的类:MyBatis加载配置初始化二级缓存组件的流程:查询获取缓存过程:接着我们看一下CacheKey是如何正确找到对应缓存的首先看CacheKey是怎么创建的limit默认是Integer.MAX_VALUE可以看到CacheKey主要由namspace+id,offset、limit、sql、请求参数和环境决定,然后将这些参数进行hash计算,得出hash值。接着就是判断CacheKey是否相等,
2022-01-01 16:42:51
381
原创 mybatis源码系列(五)—— DataSource模块
首先我们看一下几个关键的类PooledConnection:使用动态代理封装了真正的数据库连接对象;PoolState:用于管理PooledConnection对象状态的组件,通过两个list分别 管理空闲状态的连接资源和活跃状态的连接资源PooledDataSource:一个简单,同步的、线程安全的数据库连接池PooledDataSource的配置和初始化在示例代码中mybatis-config.xml中如下配置,采用PooledDataSourcemybatis在启动过程中会解析envir
2022-01-01 16:41:28
834
原创 mybatis源码系列(四)—— Log模块
示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.创建SqlSessi
2022-01-01 16:40:17
505
原创 mybatis源码系列(三)—— Excutor获取数据库数据的流程
示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.创建SqlSessi
2022-01-01 16:38:35
461
原创 mybatis源码系列(二)—— Mapper接口的binding流程
示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.创建SqlSessi
2022-01-01 16:37:52
294
原创 mybatis源码系列(一)—— mybatis启动配置加载
首先看一下我们用到的示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.
2022-01-01 16:31:42
571
原创 Spring源码系列(一)——配置Debug运行源码
1、JDK1.8版本2、spring 5.1.3.RELEASE3、安装配置gradleSpring源码下载Spring源码下载1、git clone --branch v5.1.3.RELEASE https://gitee.com/Z201/spring-framework.git2、gradle下载,gradle要JDK8的版本3、到下载的spring源码路径执行gradle命令,gradlew :spring-oxm:compileTestJava4、用idea打开spring源码工程
2021-12-24 14:59:30
1742
原创 Android优化篇之APK体积优化
在平常开发过程中,随着应用功能不断增加和版本功能迭代,APK的体积大小在不知不觉中不断增大,而APK体积大小会影响用户首次下载安装应用或更新应用的时长和流量消耗。因此,如何有效合理的优化APK的体积也是在平常开发中需要留意的。一、合理选择图片类型在APP中图片就占据了很大的一部分体积,所以图片的优化是我们必须要关注的点。平常使用到的图片类型主要有jpg、png、webp、svg等。jpg是有损压缩格式,使用的一种失真压缩标准方法,24 bit真彩色,内容比GIF丰富,不支持动画、不支持透明色。
2020-07-13 16:49:16
2434
原创 Android优化篇之布局优化
绝大部分APP的设计中,都是提供界面与用户进行交互通信,如何保证页面流畅不卡顿也成为我们需要关注的重点,本篇将介绍如何针对布局进行优化。1.捕获定位界面是否存在卡顿掉帧的情况1.1 打开Android Device Monitor工具1.2 设置要捕获的信息1.3 捕获信息点击OK后在手机上进行操作,期间的操作过程信息将被记录,捕获时间结束后自动保存到trace.html文件中。此处我的操作是捕获进入一个消息界面过程的情况。2.分析trace.html文件2.1 使用Go
2020-07-10 21:41:10
1485
原创 解决NestedScrollView嵌套RecyclerView滑动冲突导致无法正常调用加载更多功能
解决NestedScrollView嵌套RecyclerView滑动冲突导致无法正常调用加载更多功能在使用NestedScrollView嵌套RecyclerView中,首先会出现的问题就是RecyclerView滑动会出现卡顿,没有惯性滑动的效果。这时只需要调用以下方法就可以了。recyclerView.setNestedScrollingEnabled(false);这个方法主要是设置Recy...
2018-04-17 14:49:44
9201
2
原创 Android 版本更新框架——XVersionUpdate
XVersionUpdate是VersionUpdate的升级版,全面优化代码,提高兼容性和稳定性,增强用户体验,帮助我们快速实现版本更新功能。效果图——————————最近更新内容1.修复重复下载和进度条显示异常的bug2.新增取消下载功能3.修复优化评论中的其他问题。——————————1、注入依赖compile 'com.and
2017-05-23 16:35:45
18405
6
原创 二叉树的基本操作
TreeNode 类class TreeNode { int data; TreeNode leftNode; TreeNode rightNode; public TreeNode() { } public TreeNode(int data) { this.data = data;
2017-05-18 14:45:54
597
原创 PullToRefreshRecyclerView——带上拉刷新下拉加载功能的RecyclerView
现在ListView和GridView逐渐被RecyclerView替代,之前基于ListView和GridView的刷新加载框架也已经过时,这里介绍基于RecyclerView的刷新加载框架——PullToRefreshRecyclerView,先看效果。1. 在Module下的build.gradle中添加依赖compile 'com.androidkun:pulltorefreshrecycl
2017-02-09 16:55:53
15329
12
原创 Android 全局Dialog的实现方式
这里所说的全局Dialog是指无论当前应用是处于哪一个页面上,都能够及时弹出Dialog来提示用户一些信息,一般应用优先级非常高的通知。此前先查阅了网上的实现方式,大概有两种,一种是通过修改Dialog中window的type属性以及增加层叠窗口的权限,然而测试过后并没有效果,而且在6.0以及之后的版本中,想要使用增加层叠窗口的权限还需要另外做处理;另外一种是通过Service来实现的,具体怎么样没
2017-01-20 15:51:39
8756
1
原创 Android——可修改字体大小和指示器长度的XTabLayout
XTabLayout是基于design包中的TabLayout进行了功能的扩展,在保留原有功能的基础上,增加了修改选中项字体大小、修改指示器长度以及限制屏幕显示范围内显示的Tab个数。先看效果图:集成步骤:1.添加XTabLayout依赖库在app目录下的build.gradle的dependencies中添加如下引用:compile 'com.androidkun:XTabLayout:1.1.0
2016-12-22 10:09:45
30039
115
原创 Android通过SeekBar控制系统音量
通过SeekBar控制音量大小可以带来良好的用户体验并且直观地展现当前音量大小。1.自定义SeekBar样式由于系统自带的SeekBar样式一般不满足日常开发需求,所以需要我们去自定义样式。这里就简单做个示例。首先在Layout中添加SeekBar控件。 <SeekBar android:id="@+id/seekBar" android:layout_cente
2016-12-19 12:16:06
8220
3
原创 一分钟实现多文件断点续传——断点续传框架
本人先前的博客有对多文件分段断点续传的功能进行详细的介绍,如果你有兴趣可以先阅读Android多文件断点续传(一)——数据封装以及界面实现。本人在先前的基础上对代码进行了封装,本帖主要介绍如何集成封装好的框架快速实现多文件分段断点续传功能。先看效果图Github地址——————————————————————————————————————————1. 在Module下的build.gradle中添
2016-11-16 17:30:15
5165
1
原创 Android 设置Edittext获取焦点并弹出软键盘
Android 设置Edittext获取焦点并弹出软键盘editTex.setFocusable(true);editTex.setFocusableInTouchMode(true);editTex.requestFocus();activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_
2016-11-16 12:43:02
61518
4
原创 Android多文件断点续传(四)——处理网络状态变化
上一篇中我们已经介绍了如何实现多文件分段断点续传,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(三)——实现文件断点续传。本篇接着对该功能进行简单的优化,在网络状态断开的情况下能自动保存下载进度,并在网络状态恢复连接的情况下继续自动下载。首先我们需要在AndroidManifest.xml中增加读取网络状态的权限。 <uses-permission android:name=
2016-11-14 16:28:59
2243
原创 Android多文件断点续传(三)——实现文件断点续传
上一篇中我们主要介绍了如何实现数据库储存下载信息,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(二)——实现数据库储存下载信息。数据库我们已经准备好,现在就可以开始来实现DownloadService进行断点续传了。一.DownloadService/** * Created by kun on 2016/11/10. * 下载服务 */public class Downl
2016-11-11 18:40:16
4228
原创 Android多文件断点续传(二)——实现数据库储存下载信息
上一篇中我们主要介绍了数据和封装和界面的简单实现,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(一)——数据封装以及界面实现。接着我们还需要先将数据库准备好,这里用了Android自带的SQLite,对SQLite的使用一般都可以按照固定模版来实现的,具体接着往下看。一.创建DBHelper/** * Created by kun on 2016/11/10. */publi
2016-11-11 16:09:24
2630
原创 Android多文件断点续传(一)——数据封装以及界面实现
Android多文件断点续传在很多应用场景中都会运用到,更重要的是相对于简单的下载功能,断点续传在下载文件过程中能带来非常好的用户体验。本系列教程将围绕一个简单Demo介绍多文件断点续传的实现方式。先看效果图Demo所涉及主要内容如下:1. Service:用于后台处理下载文件的逻辑。2. SQLite : 用于保存下载进度。3. EventBus : 用于分发和接收下载进度。4. ThreadPo
2016-11-11 15:39:31
3529
7
原创 Android EditText禁止输入空格和特殊字符
有时候我们需要限制EditText输入的字符类型,如空格,特殊字符等,这时候我们可以使用系统提供的输入过滤器——InputFilter。具体实现如下:/** * 禁止EditText输入空格 * @param editText */ public static void setEditTextInhibitInputSpace(EditText editText
2016-11-04 15:16:27
28930
1
原创 Android城市选择列表(二)——快速索引
在上一篇文章中介绍了在RecyclerView中如何实现数据分组展示,如果你还没阅读过,建议先阅读上一篇Android地区选择列表(一)——RecyclerView数据分组。本篇接着在此基础上增加快速索引的功能。先看效果图这里我们需要自定义一个控件来实现快速索引。从效果图中可以发现其实要实现的界面很简单,我们一步一步来做。首先创建QuickIndexView继承Viewpublic class Qu
2016-10-26 15:33:53
15197
原创 Android城市选择列表(一)——RecyclerView数据分组
地区选择功能在APP中是非常常见的,Demo主要简单实现了快速索引选择地区的功能,本帖围绕此demo,介绍如何在RecyclerView中分组展示数据以及快速索引。先上效果图:1.虚拟数据创建一个类保存一串json格式的地区数据/** * Created by kun on 2016/10/26. * 模拟数据 */public class Data { public static f
2016-10-26 12:36:57
16305
4
原创 一分钟实现版本更新功能——APP版本更新框架
请使用升级版XVersionUpdateVersionUpdate是一个版本更新框架,帮助我们轻松实现版本更新功能。效果图 集成步骤1. bulid.gradle添加依赖库 compile 'com.androidkun:version_update:1.1.0'2. 调用下载方法并设置参数 /** * 启动下载服务 * * @param context
2016-09-18 10:40:53
7845
原创 一分钟实现图片选择功能——图片选择框架
ImageSelector是一个图片选择框架,帮助我们轻松实现图片选择功能。先看效果图集成步骤1.build.gradle 加入依赖compile 'com.androidkun:imageselector:1.0.1'2.处理按钮点击事件(初始化并弹出PopupWindow)/** * PopupWindow */private SelectMothedPopupWindow selectM
2016-09-14 10:14:49
1626
原创 Android内存泄漏检查利器——LeakCanary
内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序退出,如果在程序退出前达到了系统所分配的最大内存限度时,则会触发OOM导致程序崩溃。相信大多开发者对于内存泄漏并不陌生,但是如何去发现内存泄漏、定位内存泄漏以及处理内存泄漏可能就有些生疏了。本篇将介绍如何使用Android内存泄漏检查利器——LeakCanary去发现内存泄漏以及定位
2016-09-08 11:39:04
899
原创 Android WiFi开发教程(三)——WiFi热点数据传输
在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接。本篇接着简单介绍手机上如何通过WiFi热点进行数据传输。跟蓝牙通讯一样,WiFi热点数据传输也是要运用到Socket。这里我创建了两个线程ConnectThread和ListenerThread,分别去处理数据传输和监听连接。ConnectThread** *
2016-09-07 16:15:11
23038
36
原创 Android WiFi开发教程(二)——WiFi的搜索和连接
在上一篇中我们介绍了WiFi热点的创建和关闭,如果你还没阅读过,建议先阅读上一篇文章Android WiFi开发教程(一)——WiFi热点的创建与关闭。 本章节主要继续介绍WiFi的搜索和连接。WiFi的搜索 /* 搜索wifi热点 */ private void search() { if (!wifiManager.isWifiEnabled()) {
2016-09-07 15:24:58
23831
6
原创 Android WiFi开发教程(一)——WiFi热点的创建与关闭
相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机、平板电脑和笔记本电脑都支持Wi-Fi上网。因此,掌握基本的WiFI开发技术是非常必要的。本教程将围绕一个小Demo初步与大家一同探讨WiFi开发。先上效果图 Demo功能比较简单,四个按钮、两个文本和一个列表。功能主要有创建WiFi热点,关闭WiFi热点,搜索WiFi,连接WiFi,数据通讯。源码会在教
2016-09-07 14:28:02
22762
37
原创 Android蓝牙开发教程(三)——蓝牙设备相互通讯
在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获取到的BluetoothSocket交由连接线程ConnectThread来处理。 @Override public void run() { try {
2016-09-06 11:22:10
11973
19
原创 Android蓝牙开发教程(二)——连接蓝牙设备
在上一篇中已经介绍如何搜索附近可连接的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(一)——搜索蓝牙设备获取到设备后就可以开始处理蓝牙设备之间的连接。在上一篇教程中我们将搜索到的蓝牙设备展示在列表中,现在我们为列表项增加上点击事件。listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
2016-09-06 11:01:13
16694
4
原创 Android蓝牙开发教程(一)——搜索蓝牙设备
Android蓝牙功能的开发一直是很多新手头疼的问题,网上虽然也有很多教程贴,但大多都写得不全面,不能让我们真正掌握蓝牙开发的基本知识。本教程主要讲解搜索蓝牙设备、蓝牙设备之间的连接和蓝牙之间的通讯三个主要模块。掌握了这三个,基本就能进行简单的蓝牙开发了。先上效果图界面比较简单。主要有三个按钮,两个文本和一个列表。三个按钮主要对应打开蓝牙,搜索设备和发送信息三个功能。两个文本主...
2016-09-05 17:59:16
25744
16
原创 Android 自定义View——BarrageView实现弹幕功能
现在很多应用都有弹幕的功能,虽然本人没什么兴趣使用弹幕的功能,但是对如何实现这个弹幕功能还是有兴趣的。先上效果图。原理在ViewGroup上不定时地添加属性不相同的TextView执行不同的动画。BarrageView的关键代码BarrageView所需要的属性 /** * 最大的移动速度 */ private int maxSpeed; /** * 最
2016-08-11 16:51:28
3591
TinkerDemo
2017-07-06
Android版本升级
2017-05-24
PullToRefreshRecyclerView
2017-02-09
XTabLayoutDemo
2016-12-27
Android SeekBar调节音量
2016-12-19
快速实现断点续传Demo
2016-11-16
Android多文件断点续传
2016-11-11
快速索引选择地区
2016-10-26
AndroidWiFi热点Demo
2016-09-07
Android蓝牙Demo
2016-09-06
通过拍照或相册选择图片
2016-07-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人