自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 资源 (4)
  • 收藏
  • 关注

原创 netty源码解读之--ChannelPipeline责任链机制

这里也能看出来,如果向ChannelPipeline中添加一个handler其方法执行完之后不调用ctx.fireXXX方法就会导致执行链路在这个handler断开不会执行到最后的Tail节点会导致一些问题,比如在channelRead方法最后需要释放内存,而释放内存的操作默认是在尾部节点TailContext的channelRead里做的,如果提前中断传递且未手动释放内存将导致内存泄露。到这ChannelPipeline的责任链机制也就讲的差不多了,有什么没讲到的或者有问题的希望大家在评论区多多交流。

2025-10-10 14:09:49 1007

原创 netty源码解读之---事件传播机制核心组件介绍

什么叫”入方向“ 呢?,该接口可以理解成一个管理ChannelHandlerContext的接口,ChannelHandlerContext接口会形成一个双向链表,而通过ChannelPipeline可以操作这个双向链表,比如向该链表添加新的元素,删除元素,插入元素等这就是ChannelPipeline的主要作用。定义了出方向的一些方法,比如向往去执行连接请求,断开一个连接等会回调执行ChannelOutboundInvoker接口里定义的一些方法,该接口定义比较清晰就不多说了。

2025-10-05 20:49:44 750

原创 netty源码解读之---ChannelFuture以及Promise分析

前两篇文章介绍netty的事件轮询,今天我们来说一个比较简单的组件ChannelFuture,在讲EventExecutorGroup的时候我们就知道其提交的任务返回的都是netty自定义的Future对象,相信大家对jdk的Future对象并不陌生,它被用来处理异步结果。有个Future的特殊实现接口Promise,Future接口用来异步获取执行结果,而Promise接口可以手动的去操作执行结果,比如提前设置任务为取消/完成/失败而不需要非要等到任务自身的执行完成。

2025-10-03 22:38:03 29

原创 netty源码解读之--事件轮询介绍

上一篇我们介绍了EventLoopGroup,EventExecutorGroup,EventLoop,EventExecutor几个组件的作用及之间的关系,这篇我们来看下事件循环到底是个啥又是怎么做的。这篇如果只讲event loop那可能没啥好讲的东西很少,可能是我个人对event loop理解的不是很透彻吧,也希望看了这篇的大佬们可以在评论区指点下,我好完善一下,好了下面我们进入正题。其实我理解这里是不同职责,在代码块1中for(;)的目的是达到线程不退出的目的,而代码块2才是真正的事件轮询的实现。

2025-10-03 20:36:00 156

原创 Netty解读源码之---EventLoopGroup,EventExecutorGroup,EventLoop,EventExecutor详解

也就是SingleThreadEventExecutor类执行任务的逻辑是把任务放到队列里,严格控制只用一个线程去执行。再来看看EventExecutor,从名字上看它一个事件执行器,它实现了EventExecutorGroup接口,所以它有EventExecutorGroup的所有能力也就是可以用来执行/暂停任务,从该类的注释说它是一个特殊的EventExecutorGroup,提供了可以校验一个线程是否被执行在一个Event loop即事件循环里,也就是我们后面要说的EventLoop,后面再说。

2025-10-03 11:00:15 639

原创 从根儿上学习spring 十一 之run方法启动第四段(5)

如果该方法返回了false说明bean属性已设置完毕不需要populateBean方法后续继续对bean进行属性设置。这几行的逻辑就是调用了invokeAwareMethods(beanName, bean)方法,这个方法的逻辑很简单就是判断当前初始化的bean是不是实现了Aware接口,如果实现了该接口那么就判断具体的Aware接口类型,比如是否是BeanNameAware接口,是的话则调用其setBeanName方法等等,这个方法很简单大家自己点进去看下就明白了,我就不赘述了。我们看下该方法的代码。

2024-08-04 22:13:06 776 1

原创 从根儿上学习spring 十 之run方法启动第四段(4)

这其实主要是为了防止这个bean存在动态代理的情况,如果存在动态代理那这个bean的引用就会更改,从普通的bean变成动态代理的bean,如果这时候简单的把刚实例化好的普通bean暴露出去那就会有问题。这就得结合bean的初始化生命周期来看,这时候的bean实例是创建出来了,相当于new出来一个完全新的对象,而对象的属性还没设值,所以这时候对beanDefinition的操作也最多是影响bean的属性初始化。当前bean是A,在初始化属性B的时候又会尝试去获取A,所以会再次走到A的初始化过程)

2024-08-04 22:10:35 844

原创 从根儿上学习spring 九 之run方法启动第四段(3)

一般情况下调用doGetBean方法获取的bean实例都是为了真实使用的,像我们上面举得A,B对象的例子获取的A,B对象当然都是为了真实使用的,但有种场景就只是为了做类型检查,比如有时候为了判断FactoryBean里的对象的类型就要先获取FactoryBean再通过getObject方法获取里面的真实对象来判断其类型,这时获取的FactoryBean实例可能就只是为了类型检查并不是为了真实使用。二:当bean是多例时,会有不同的创建bean的逻辑,下面我们按照代码顺序先分析单例的情况。

2024-08-04 22:07:39 1063

原创 从根儿上学习spring 八 之run方法启动第四段(2)

后面我们讲bean的初始化过程还会讲到这里就先到这。假设spring先初始化A,这时候发现A依赖B所以在初始化A的过程中被打断跑去实例化并初始化B(注意这时候A的初始化过程被打断了),在初始化B的时候发现B又依赖A,spring又尝试去初始化A,这时候调用getSingleton(String beanName, boolean allowEarlyReference)方法时(beanName为A),isSingletonCurrentlyInCreation(beanName)方法就会返回true。

2024-08-04 22:03:51 792

原创 从根儿上学习spring 七 之run方法启动第四段(1)

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法的逻辑准确来说的话就是执行了了两个接口的两个方法,分别是BeanFactoryPostProcessor接口的postProcessBeanFactory方法和BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法,执行顺序是先执行前者再执行后者。让我们直接进入正题。

2024-08-04 21:58:50 1087

原创 从根儿上学习spring 六 之run方法启动第三段

362行就不需要多说啥了,363行是对applicationContext就行后置处理,postProcessApplicationContext方法的逻辑是向applicationContext里设置BeanNameGenerator对象(该对象用来生成bean名称的,如果你有指定的话)以及设置ResourceLoader接口实现,该接口主要用来加载classpatch下的资源,后面用到我们再细说。解释完BeanDefinitionLoader我们直接到图5的696行的load()方法里看看它做了啥。

2024-08-04 21:55:10 552

原创 从根儿上学习spring 五 之run方法启动第二段

讲完了PropertySources和PropertySource,我们再回头看图6的方法configurePropertySources方法似乎变得很简单没必要一行行分析了吧,这个方法就是向environment的sources属性里加入启动时的两个PropertySource,有不清楚的同学再结合我上面说的对着代码看两遍就清楚了,我就不再赘述了。Environment接口继承了PropertyResolver接口,PropertyResolver接口主要提供了获取配置属性的方法,如图3所示。

2024-08-04 21:51:20 802

原创 从根儿上学习spring 四 之run方法启动第一段

由上图可以看到在getSpringFactoriesInstances方法里先获取了类加载器,然后使用SpringFactoriesLoader.loadFactoryNames(type, classLoader)方法是获取所有META-INF/spring.factories资源文件里的数据,META-INF/spring.factories文件里的内容大概是xxx=yyyy的形式,而这里的xxx就是type.getname()的值,yyyy就是获取到的names集合里的每个string值。

2024-08-04 21:46:50 826

原创 从根儿上学习spring 三 之依赖注入原理了解

举个例子,你为公司所有业务部门写了一个针对一些中间件优雅下线的通用功能,可你不确定后面公司业务部门会不会后面引入其它的中间件,所以你定义了一个接口GraceDownInteface,接口里定义一个下线方法,规定所有实现了该接口的方法在服务挂掉前都会被自动执行。前面的beanFactory和bean分别代表需要扩展的对象,BeanFactory是spring的 bean容器,bean就是spring创建的bean实例。针对上面的步骤我们都可以对其做扩展处理,并且可以在每步的前后都可以做扩展处理。

2024-08-04 21:42:52 515

原创 从根儿上学习spring 二 之依赖注入原理了解

很快我们发现在SpringApplication#prepareContext里使用了getAllSources方法,在并将获取到的primarySources属性传给了SpringApplication类的load方法,跟随着load方法一步一步debug下去就会发现spring把TestMain.class封装成了BeanDefinition,并放到了DefaultListableBeanFactory的Map类型的beanDefinitionMap属性中了,key为testMain。

2024-08-04 21:40:28 739

原创 从根儿上学习spring一 之杂谈

从根儿上学习spring

2024-08-04 21:37:30 565

转载 Java NIO 对 OP_WRITE 的处理 解决网速慢的连接

最近在用Java NIO, 回顾自己写的程序发现里面居然没有OP_WRITE,每次都是在OP_READ的处理逻辑中直接使用SocketChannel.write(ByteBuffer)就能够达到写数据的需求,那为什么还要OP_WIRTE呢?网上找到相关的文章,原来自己的程序是有很多细节没有考虑的,慢慢学习进步吧:17.3.1 如何处理慢速的连接对企业级的服务器软件,高性...

2020-01-08 16:23:01 558

原创 getDeclaringClass,getDeclaredClasses,getClasses的区别

getDeclaringClass 该方法返回一个Class对象,返回当前class对象的声明对象class,一般针对内部类的情况,比如A类有内部类B,那么通过B.class.getDeclaringClass()方法将获取到A的Class对象. 在使用反射对象时比如Method和Field的getDeclaringClass方法将获取到所属类对象getDeclaredCl...

2020-01-07 16:51:29 9494

原创 java type接口及子接口ParameterizedType,TypeVariable,GenericArrayType,WildcardType说明

Java的Type接口是Java中所有类型的父亲,所有类型!抄袭一张图片,下图展示了Type的继承结构,下面对每一种类型做详细说明并结合代码的形式。ParameterizedType:字面意思是参数化类型,感觉不太好理解,其实就是声明时带有泛型的类型,如果还不懂就看下面的例子演示吧TypeVariable:字面意思"类型变量",其实代表的就是泛型尖括号里的东西,比如List&lt...

2019-11-27 16:30:03 1481

转载 maven settings.xml说明

<?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ma...

2019-11-22 16:18:17 205

原创 org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean

今天写工具方法在,在一个被其他工程依赖的项目里加了一个dao类,其它依赖项目报错org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'hqAuthMapperExt' for bean class [com.hunqingplatfor...

2019-11-19 22:28:21 2556 1

原创 AutowiredAnnotationBeanPostProcessor和RequiredAnnotationBeanPostProcessor源码简析

首先声明,本人正在努力学习spring源码,如果有志同道合的朋友可以先私信然后加好友讨论。本文比较简单由于刚看不久更多的起到记录笔记的作用,欢迎各位大佬指出问题。 首先提出问题:1.spring在什么时候开始解析@Autowired注解实现依赖注入的呢?2.@Qualifier又是如何与@Autowired配合使用的呢? 首先要明确一点的是,在spring解析beanD...

2019-11-18 11:48:25 755

原创 spring创建aop代理对象流程分析

1.在实例化bean之后会调用AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterInitialization方法,该方法会找到所有实例化好的BeanPostProcessor对bean进行后置处理2.AbstractAutoProxyCreator的postProcessAfterInitialization方法会...

2019-11-04 19:43:40 954

原创 spring boot启动读取并初始化mybatis mapper

在Configuration类上我们一般会加上@MapperScan(basePackages = "com.hunqingplatform.hunqing.dao.mapper1.ext",sqlSessionFactoryRef="sqlSessionFactory")这样的注解,点进该注解你会看到该注解又被@Import注解给注解了@Import注解是往spring容器中导入一些b...

2019-11-03 15:29:29 1353

原创 spring源码获取所有Advisor记录

接着上一篇spring实例化包含@Transational注解类(不论是类上还是方法上)的流程。1.在BeanPostProcesser的实现类AbstractAutoProxyCreator的wrapIfNecessary方法里调用getAdvicesAndAdvisorsForBean方法2.在其父类AbstractAdvisorAutoProxyCreator的getAdvice...

2019-10-31 16:02:46 428

原创 spring @Transational注解注释的方法或者类的初始化流程

1.入口是AbstractApplicationContext类的refresh方法调用finishBeanFactoryInitialization方法2.进入finishBeanFactoryInitialization方法的beanFactory.preInstantiateSingletons()方法3.在preInstantiateSingletons方法里调用getBe...

2019-10-31 13:14:20 376

原创 count与case when配合使用问题

SELECT COUNT(case when age>15 then scone ELSE 1 end) FROM `t_z_test1`;SELECT COUNT(case when age>15 then scone ELSE 1 end) FROM `t_z_test1`;MySQL执行这条sql时会每条记录的去执行count里的条件 如果满足age>15就对当前记...

2019-10-24 14:42:58 8403

原创 Java使用itext生成pdf

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <versi...

2019-10-12 13:53:52 581

转载 java泛型理解

1、泛型概念的提出Java语言类型包括八种基本类型(byte short int long float double boolean char)和复杂类型,复杂类型包括类和数组。早期Java版本(1.4之前)如果要代指某个泛化类对象,只能使用Object,这样写出来的代码需要增加强转,而且缺少类型检查,代码缺少健壮性。在1.5之后,Java引入了泛型(Generic)的概念,提供了一套抽象的类...

2019-09-14 15:47:30 274

转载 eclipse使用alt+/很卡的解决方法

1、点击报错的那个连接(Content Assist) ,或者 打开 Windows>preferences>Java>Editor>Content Assist>Advanced2、将Default Proposal Kinds栏中(上面框)Java Proposals (Code Recommenders)取消对勾。3、生效后,我的...

2019-09-01 09:49:48 914

原创 eclipse安装lombok教程

1.下载lombok.jar 下载地址https://projectlombok.org/download2.将lombok.jar放在eclipse的安装目录下与eclipse.ini文件同级目录3.执行java -jar lombok.jar命令4.出现点击确定。点击Specify location按钮选择eclipse安装目录,只需选到eclipse.ini文件的上一级即可。...

2019-02-15 14:48:59 376

原创 fatal unable to access 'https //.git/' the requested url returned error 500

git在创建新项目没有任何文件时使用git clone命令克隆会报fatal unable to access 'https //.git/' the requested url returned error 500错

2019-02-01 09:38:12 8248

原创 eclipse Java文件修改双击一个单词时搜索出其它相同单词的背景色

在使用eclipse开发Java工程时经常会在Java文件里选择一个单词双击看看哪里引用到,eclipse会默认把所有相同单词背景色修改标记出来。可如果背景色是黑色的就啥也看不出来就很烦,如果想修改很简单window-preferences--editors--textEditors--annotations然后找哪些背景色是黑色的一个个试下就行了,应该就是哪些occurrences单词对应的哪些...

2018-12-13 10:53:49 895

原创 spring事务执行了但却不生效

我的博客都是几句话把问题记录下就好。   今天测试spring事务时总是不生效通过追踪源码发现它也执行了rollback可数据库里的数据却没有被撤销,奇怪的很,然后把出错那行上面的动态创建表的DDL语句代码给注释掉事务就正常了,现象已说明下面稍微说下自己的想法。   本屌猜测innodb引擎的事务使用行锁和分段锁对只能基于存在的表,当发现有DDL语句参与回滚时就直接放弃此次回滚操作。纯属猜...

2018-12-11 17:15:39 404

转载 cookie及session详解

转载地址:https://www.cnblogs.com/andy-zhou/p/5360107.html目录Cookie机制什么是CookieCookie的不可跨域名性Unicode编码:保存中文BASE64编码:保存二进制图片设置Cookie的所有属性Cookie的有效期Cookie的修改、删除Cookie的域名Cookie的路径Cookie的安全属性JavaScript操作Cooki...

2018-12-03 17:16:57 281

原创 关于在过滤器加@compent注解导致urlPatterns不起作用记录

我这么写了个过滤器请求时所有的请求都被拦截了,最后听说因为加了@compent或者@configruation注解的原因。去掉果然正常了。想知道为什么会这样以后有时间再研究吧。先记录下...

2018-08-31 16:40:13 4356 1

原创 log日志打印输出过长被自动截断打印一句的问题

在启动参数里添加-XX:-OmitStackTraceInFastThrow 参数即可

2018-08-17 10:26:50 8248

原创 关于junit单元测试时用户线程自动终止问题

     在使用junit单元测试spring boot rabbitMQ时在onmessage方法里接收到消息正断点着呢,突然线程自动断掉了,一脸懵逼的我各种找rabbitmq的过期配置设置了一些值后再测试发现断点时间延长了,可并不是我设置的时间,无论我设置多长程序都会在一个固定时间内推出。再不使用junit测试时却不会出现这种情况。    所以断定肯定是junit的问题,百度下说junit...

2018-08-15 11:47:07 3175

转载 java中的原子操作

Java中的原子操作包括:1)除long和double之外的基本类型的赋值操作2)所有引用reference的赋值操作3)java.concurrent.Atomic.* 包中所有类的一切操作。但是java对long和double的赋值操作是非原子操作!!long和double占用的字节数都是8,也就是64bits。在32位操作系统上对64位的数据的读写要分两步完成,每一步取32位数据。这样对do...

2018-05-26 11:58:14 1772 5

转载 转载MySQL创建用户并授权

一. 创建用户命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';说明:username:你将创建的用户名host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器例子:...

2018-05-21 16:14:29 216

ichartjs最新库

这是我下载得最新的ichartjs库 利用这个库文件可以开发绚丽的前端图形

2015-07-28

头像剪切demo

一个简单实用的js插件剪切头像并上传的demo

2015-07-23

poi的架包

这是我下载得poi加班操作各种excel表格和word文档

2015-07-28

json架包哦

一个好用的jsonjar文件,使用json再也不用烦心了哈哈哈

2015-07-23

空空如也

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

TA关注的人

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