- 博客(59)
- 资源 (6)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 JAVA服务端的解码
JAVA服务端的解码 引起乱码问题的缘由是编码与解码方法的不对称,为了能和客户端正确的交互,需要了解下服务端是何时,何处以及如何对内容进行编解码的。按照请求处理的过程,我们先来一一分析一下Java服务端对HTTP内容的解码过程。一,URI的解码 在tomcat中,负责对URI解码的是org.apache.catalina.connector.CoyoteAdapter的co
2015-11-23 23:18:18
5399
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 谈谈spring中bean的名字
谈谈spring中bean的名字 提到bean的名字,就要从声明bean的地方说起。在应用spring时,有两个地方可以声明一个bean,一个是在spring的配置文件中,一个是在代码中通过Component等标注声明。 代码中可以通过标注的方式来表示这个类是属于spring管理的类,这类标注有Component、Repository、Service以及Contro
2015-11-14 17:46:37
15471
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 SpringIoC依赖注入的过程(二)
SpringIoC依赖注入的过程(二) 上文讲到spring通过AbstractAutowireCapableBeanFactory的doCreateBean方法来创建并且初始化一个bean,doCreateBean首先生成一个未初始化的bean,然后再对它进行依赖注入、属性解析以及回调bean的方法等等。本文将继续讲解spring是如何做到这些的。 衔接上文,分析doCreate
2015-11-03 23:40:16
6453
原创 springboot源码解读之内嵌tomcat的启动
目录BeanDefinition注册创建配置TomcatTomcat基本组件配置Context配置TomcatStart中的initializer启动tomcatService启动容器启动DefaultServlet悬案启动Connector在springboot之前,web服务都是要部署在web容器里的。但是springboot改变了这个模式,web...
2020-04-16 00:28:30
542
原创 springboot源码解读之@ConfigurationProperties原理
动态注册ImportBeanDefinitionRegistrar是spring提供的动态注册的扩展点,它与@Configuration和@Import注解配合可以实现组件的动态注册。需要该组件时就注册组件,使用相关的功能;不需要该组件就不注册组件。只需要一个类型@EnableXXX注解就可以决定是否注册该组件。ConfigurationClassParser从声明了@Configurati...
2020-04-11 23:43:09
934
原创 springboot源码解读之RefreshScope动态刷新配置
目录scope原理从容器中获取scope bean负责创建scope bean的ScopedProxyFactoryBeanRefreshScopeRefreshScope缓存清理配置重新加载scope原理从容器中获取scope beanscope是spring framework中的概念,对于singleton和prototype对象的获取在beanFa...
2020-04-10 00:36:32
5610
原创 springboot源码解读之使用springcloud加载配置
前言前面一篇文章https://blog.csdn.net/hongxingxiaonan/article/details/105129792讲了springboot如何加载本地配置。默认情况下,springboot会加载classpath下的application.properties等文件。可能会遇到有的工程里配置了bootstrap.properties也是生效的,但并没有自定义spri...
2020-04-06 23:30:50
1186
原创 springboot源码解读之配置从哪来
概述用了一段时间springboot,但对于springboot的配置原理始终不太了解,带着如下疑问学习一下源码:springboot都从哪里读取配置,顺序是什么样的?bean中的属性是怎么注入的?配置变更时怎么动态修改bean属性?配置加载public ConfigurableApplicationContext run(String... args) { St...
2020-03-30 00:33:09
297
原创 CMS垃圾收集器运行原理
目录概述执行过程初始标记并发标记并发预清理可中断预清理重新标记并发清理并发重置数据结构card table异常情况概述CMS垃圾收集器是一款优秀的老年代并发垃圾收集器,通过与用户线程并发执行的方式减少GC停顿的时间。本文主要聊一下CMS设计到的相关的数据结构、具体的执行过程、运行中会出现的异常情况。在CMS之前并行垃圾收集器通过下图...
2020-03-24 23:18:41
1378
3
原创 Linux下安装redis-2.8.3
Linux下安装redis-2.8.3安装下载安装包 wget http://download.redis.io/releases/redis-2.8.3.tar.gz)解压 tar -zxf redis-2.8.3.tar.gz cd redis-2.8.3 sudo make sudo make installcp src/redis-server src/redis-cli /us
2017-06-20 20:56:24
1356
原创 及时释放服务端与客户端之间的TCP连接的方法
及时释放服务端与客户端之间的TCP连接的方法TCP的状态转换图 先贴上tcp状态转换图,方便后面分析问题 感知对端关闭,及时关闭己方连接 前几天遇到了一个问题,服务端下线,主动断开了连接。但客户端并没有感知到,而是继续使用该连接,导致下次调用服务端报错。 查看客户端和服务端的tcp状态,服务端处于FIN_WAIT_2状态,而客户端处于CLOSE_WAIT状态。 结合
2017-06-12 15:29:45
7120
原创 commons-pool2对象池分配回收策略
commons-pool2对象池分配回收策略 前一段时间写了一个rpc的客户端,使用apache commons-pool2的对象池管理长连接。其中由于没有完全弄清楚各个参数的意义,即其中分配回收策略,所以出现了一些不太合理的现象。最近详细看了源码,这里整理一下。一、对象的创建1. 对象创建的时机 对象的创建有两个时机,一个是应用像对象池获取对象时;另一个是空
2017-06-02 16:57:08
2823
转载 VisualVM远程监控连接方法
1. 通过jstatd启动RMI服务 配置java安全访问,将如下的代码存为文件jstatd.all.policy,放到JAVA_HOME/bin中,其内容如下, grant codebase "file:${java.home}/../lib/tools.jar" { permission java.secu
2016-08-18 20:58:38
2312
原创 Redis的Java客户端源码解读
Redis的Java客户端源码解读 Redis的Java客户端对应的类叫做Jedis。客户端调用redis可以直接利用IP端口建立一条连接,即创建一个Jedis,之后就可以用这个Jedis对象执行命令。也可以做一个连接池,大家不用排队使用一条连接。像下面这样: JedisPool pool = new JedisPool(new JedisPoolConf
2016-06-05 18:09:33
2005
转载 如何在 Java 中正确使用 wait, notify 和 notifyAll
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内
2016-01-17 21:18:05
730
1
原创 JVM关闭及线程的退出
JVM关闭及线程的退出一,关闭方式 JVM的关闭意味着将停止系统中所有的任务,可以由其自动关闭也可以主动触发。下面的几个条件都可以使JVM关闭:1,所有的非守护都已经运行结束。2,调用了System.exit方法。3,杀死JVM进程4,通过系统平台发送关闭信号(比如按Ctrl+C)二,关闭钩子 如果我们想在JVM关闭时做
2016-01-16 16:46:43
9343
原创 Java线程未捕获异常处理
Java线程未捕获异常处理 线程执行完run方法即可正常退出,如果发生了没有捕获的异常则会异常退出。大多数情况下,由于异常导致的线程退出都不是我们想要的。所以在编写的代码的时候要尽可能的捕获处理可以处理的异常,但是也不能光简单的捕获异常然后什么也不做。下面介绍线程异常的处理办法。 JVM为我们提供了线程的未捕获异常处理机制,通过Thread的setU
2016-01-16 13:14:26
10551
1
原创 Java线程的中断
Java线程的中断 Java没有提供抢占式的线程中断方式,所以线程的退出必须以一种协作式的机制来实现。一个线程没有权利停止另一个线程,但是可以告诉另一个线程我想要你停止,另一个线程可以立即停止、也可以完成某些任务后停止、甚至可以不停止。一,一个简单线程协作中断的例子public class SimpleCooperation { private
2016-01-15 23:25:58
668
原创 了解Java中的线程
了解Java中的线程 在Java中,提供了对线程的支持。用户可以定义自己的线程,并且启动执行它们。当使用到线程的时候,最好对自己的线程有所了解,什么时候启动,什么时候结束,发生异常会怎么样,是否会发生阻塞,是否可以中止,等等。只有了解了这些,线程才能真正的为我所用。 一,线程的创建 Java中的线程由Thread类表示,有两种方式可以创建线
2016-01-14 23:19:22
691
转载 深入理解Java内存模型(六)——final
原文地址: 深入理解Java内存模型(六)——final与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,
2016-01-12 20:56:58
639
原创 了解Java并发集合ConcurrentHashMap
了解Java并发集合ConcurrentHashMap 同Hashtable一样,ConcurrentHashMap也是一个线程安全的map结构集合,并且在多数情况下可以表现出更好的性能。因为ConcurrentHashMap使用了分段锁技术,将整个hash表分成了若干的segment,对其中一个segment加锁的的时候不会影响其他segment的访问
2016-01-11 23:38:02
906
原创 Java利用classloader从classpath加载资源
Java利用classloader从classpath加载资源 我们都知道classloader的getResource、getResources等方法可以加载classpath中的资源。classloader获取资源传入的参数是相对于classpath的相对路径,如果某个资源想要被classloader的加载到就要放到当前的classpath中,或者把资源所在的目录或
2016-01-09 14:09:00
10923
1
原创 Mybatis启动递归层次太多导致Stackoverflow
Mybatis启动递归层次太多导致Stackoverflow 前段时间有一次启动Spring+Mybatis项目,遇到了线程栈内存溢出的情况。好在虚拟机在崩溃的时候将线程栈中的方法调用关系都打印了出来,问题也非常好定位。 经过debug发现,为Dao生成代理的时候首先要生成它的FactoryBean,也就是MapperFactoryBean。而MapperFacto
2016-01-07 22:14:06
4155
3
原创 关于Java中的异常
关于Java中的异常 异常的使用是Java程序离不开的一项技术,可以说没有异常处理的系统不是好系统。异常的发生说明程序遇到了错误,这个错误可以是可恢复的,也可能是不可恢复。有的异常是在编译期可以预见的,有的异常则是在运行期才抛出。常见的异常如文件找不到,找到了没有权限读,读到了但是没有权限写等。但是,并不是说所有的如文件找不到的情况都说明系统发生了错误,还是要根据自己系统的实际
2016-01-05 22:14:22
490
原创 Java中的类加载器
Java中的类加载器 类加载器是Java语言的创新,它负责通过类的全限定名找到其对应的字节码,并且从中定义出Java类对象即java.lang.Class的实例。虚拟机的设计者甚至运行开发者定义自己的类加载器,实现自己的类加载逻辑(但是要遵循一定得规则,后面会讲到)。 一,双亲委派 所有的知道类加载器classloader的Java开发者都应该知
2016-01-03 12:57:14
420
原创 Java中的方法分派
Java中的方法分派 程序设计中,许多时候把不同的函数命名成名字相同可以更清晰地表达出语义。相同的方法名字,需要根据方法的参数、调用者等信息来确定到底应该执行哪个方法。这个确定执行哪个方法的过程就是方法分派。 众所周知,Java是一门面向对象语言,为我们提供了重载和重写的机制。那么,在重载和重写的背后是一个怎样的原理或者原则呢?今天通过实验来揭示 一,静态
2016-01-02 14:32:39
1760
1
原创 Java中的自动拆装箱
Java中的自动拆装箱 Java语言中,基本类型和它对应的封装类型直接可以相互复制,共同参与运算。其实,经过编译后并不是直接使用不同的类型来进行赋值和运算,而是采用了自动拆装箱的方式把数据类型进行了变化。自动拆装箱只是JDK语法糖技术中的一个。如下的代码是可以通过编译并且成功运行的: public void assignment(){ int
2015-12-29 23:12:00
885
原创 理解JVM的class文件结构
理解JVM的class文件结构 开发者将Java代码写在.java文件中,经过编译器的编译生成了class文件,原来在Java文件中定义的信息将转存到class文件中。只有经过编译后的class文件才能被虚拟机理解,JVM才能将文件中的内容转换成其自己的内存结构。这个过程中,开发者和jvm好比不能沟通的两个人,但是开发者可以通过翻译(编译器)将他自己才懂得Java翻译成cla
2015-12-19 23:50:02
633
原创 SpringAOP模块初始化过程
SpringAOP模块初始化过程 SpringAOP模块的初始化过程可以分为如下几个步骤:1,读取配置,生成Advisor、PointCut等信息。 跟SpringAOP的相关标签比较多,我们可以选择任意一种方式声明AOP。如下就使用了三种不同的方式: 2,在容器创
2015-12-17 09:03:47
3209
原创 SpringMVC中WebDataBinder的应用及原理
SpringMVC中WebDataBinder的应用及原理 Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型。若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数。众所周知,无论客户端传入的是什么类型的请求参数,最终都要以字节的形式传给服务端。而服务端通过Request的getParamete
2015-12-13 17:01:14
25420
2
原创 SpringMVC对HTTP报文体的处理
SpringMVC对HTTP报文体的处理 客户端和服务端HTTP报文传递消息,而HTTP报文包含报文头和报文体。通常,解析请求参数以及返回页面都不需要我们关心HTTP报文体的读取和生成过程。但在某些特定场景下需要直接到请求报文中读取报文体,或者将返回的数据直接写入到报文体中。 在SpringMVC中,可以利用RequestBody注解表示一个参数,说明解析它需要读取报文体,也
2015-12-12 20:23:08
4046
原创 SpringMVC中的HTTP跳转
SpringMVC中的HTTP跳转 项目开发中经常会碰到需要进行HTTP跳转的场景,比如用户请求一个需要登录之后才可以看到的页面,而此时需要跳转到登录页面,待登录成功之后在跳转会现在的页面。那么SpringMVC是怎样实现这样的跳转的呢?今天就让我们仔细的研究一下。一,Servlet中forward与redirect 在原生的Servlet技术中有两种跳转
2015-12-11 23:37:45
7174
2
原创 SpringMVC响应结果的生成
SpringMVC响应结果的生成 前面的文章讲过,SpringMVC接收到来自客户端的请求,找到处理请求的Handler,然后构造适配器HandleAdapter。HandleAdapter处理请求后返回ModelAndView对象(也可能返回null)。以RequestMappingHandlerAdapter为例,看看ModelAndView是怎样生成的,它的invokeHandlerM
2015-12-10 21:55:33
1967
原创 SpringMVC中的HandlerAdapter
SpringMVC中的HandlerAdapter 还记得在DispatcherServlet中SpringMVC处理请求的逻辑吗,网上有一个非常棒的图,阐明了请求分发处理的整个过程。 映射处理器HandlerMapping根据Request返回一个HandlerExecutionChain实例,HandlerExecutionChain并不是真正的处理器Han
2015-11-29 22:24:31
4322
原创 SpringMVC中自定义参数解析器及内置类型的绑定
SpringMVC中自定义参数解析器及内置类型的绑定 前一篇文章讲述了使用标注方式进行参数绑定背后的参数解析原理,今天来整理一下没有使用标注的参数是怎样解析出来的。一,自定义参数解析器 有的时候我们希望在HandlerMethod中直接使用一些对象,而不需要主动去创建或获取。例如,我们想在一个请求方法的第一行打印出系统登录用户的相关信息,而这个用户信息已经再Request中
2015-11-28 22:09:20
10050
原创 SpringMVC中HandlerMethod的请求参数解析过程
SpringMVC中HandlerMethod的请求参数解析过程 SpringMVC中处理请求的方法叫做HandlerMethod,HandlerMethod可以通过多种方式声明它的参数来源,同时对应着不同的解析过程。那么,今天我们就来详细的研究一下SpringMVC请求参数的解析过程。 直接定位到参数解析的方法,下面列出了HandlerMethodInvoker的resolveHand
2015-11-28 14:01:27
17106
原创 HTTP协议中的编码问题
HTTP协议中的编码问题 基于HTTP协议的web网站的建设中,时常会遇到显示乱码的情况。引起乱码现象的原因归根到底就是编码与解码过程的不对称,那么我们就来了解一下HTTP协议的编码规则。一,URL与UrlEncode 网络上的资源都可以通过统一资源定位符(URL)访问到,URL是统一资源标识符(URI)的最常见形式,可以精确说明资源的位置以及如何访问资源。URL需要满足
2015-11-22 16:07:00
7925
原创 字符编码研究
字符编码研究 应用开发中,经常会遇到乱码的问题,对于新手尤其如此。为了原理乱码问题带来的困扰,特整理一下字符编码的原理,从根本上杜绝乱码的出现。一,相关概念 在计算机的世界中,所有的信息都是由01组成的二进制信息,当然也包含字符。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。那么如何将这些字符转换成计算机理解的二进制信息就是编码过程,如何将二进
2015-11-20 23:07:48
3401
原创 无处不在的扩展点BeanPostProcessor
无处不在的扩展点BeanPostProcessor 在spring创建bean的过程中,多次出现了BeanPostProcessor的身影,它们是怎么来的,可以怎么用?本文就对spring中的BeanPostProcessor做个总结。 public interface BeanPostProcessor { Object postProcessBeforeI
2015-11-17 22:50:03
6147
原创 SpringIoC依赖注入的过程(六)
SpringIoC依赖注入的过程(六) 前几篇文章详细地解读了Spring的依赖注入的过程,触发依赖注入的是getBean方法,依赖注入发生的地方是populateBean方法,而获取依赖bean的实例还是通过getBean方法。截止到上文已经解读完populateBean的全部逻辑,本文介绍下,依赖注入之后bean的初始化操作。回到AbstractAutowireCapableBean
2015-11-08 22:37:55
4083
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人