自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 Springboot中,异步线程的执行顺序的控制

Spring boot中异步任务的执行顺序控制。

2023-01-13 12:11:04 2323 2

原创 12、Spring特性-non-lazy-init

在之前的文章,笔者讨论的都是在用户第一次调用的时候触发的IOC过程,也就是所谓的lazy-init,下面看一下non-lazy-init,它是在IOC容器初始化的时候就把实例注入到了IOC容器中,它的思想是在容器完成对XML文件的BeanDefinition封装之后主动触发了该过程,具体过程和之前的IOC注入过程没有太大的区别,都是去调用getBean。不同就只有调用的触发对象和调用时间不同。

2018-01-27 09:39:43 474

原创 11、IoC之依赖注入(5)-属性注入过程

在得到一个代理生成的目标对象之后,需要对目标对象进行属性注入,具体的实现是在AbstractAutowireCapableBeanFactory类中的populateBean方法中实现。具体代码如下:  // AbstractAutowireCapableBeanFactory // 使用bean定义中的属性值在给定的BeanWrapper中填充bean实例。 protected void

2018-01-27 09:36:36 398

原创 10、IoC之依赖注入(3)-解析注入的属性

对于属性注入的间接引用,具体的解析过程是在BeanDefinitionValueResolver类中的resolveValueIfNecessary方法中实现的,主要解析Array,Set,Map,props和字符串类型的间接引用。具体实现源码如下: // BeanDefinitionValueResolver // 给定一个PropertyValue,返回一个值,必要时解析对工厂中其他

2018-01-27 08:31:19 332

原创 9、IoC之依赖注入(2)-bean的代理对象生成

在前面已经封装好BeanDefinition之后,那么接下来就根据指定的BeanDefinition通过反射生成指定的对象。1、根据目标对象确定实例的产生方式:JDK或者CGLIB。有Override方法目标对象,使用CGLIB方式实例化具体的对象。 // SimpleInstantiationStrategy // 具体的bean实例化 // JDK或者CGLIB @Overr

2018-01-26 15:01:37 712

原创 8、IoC之依赖注入(1)-getBean过程

从本篇blog开始,笔者开始开始分析IoC容器的依赖注入过程。1、依赖注入发生的时间有两个:A、用户第一次调用getBean方法时;B、配置了lazy-init属性,在IoC容器初始化的时候就发生了; 2、具体看一下第一种,用户第一次调用getBean方法时发生的依赖注入。Spring容器实现了很多的BeanFactory,并且实现了很多getBean方法的重载,但是通过跟踪代

2018-01-26 14:57:15 385

原创 7、IoC容器的初始化(6)-BeanDefinition注册

在解析完Document读取的XML文件之后,会返回若干个BeanDefinition对象,那么解析来就是把这些对象注册到BeanFactory中,等待使用。注册BeanDefinition的入口是BeanDefinitionReaderUtils中的registerBeanDefinition方法:1、向给定的BeanFactory工厂注册给定的BeanDefinition。 //Bea

2018-01-26 14:48:47 205

原创 6、IoC容器的初始化(5)-具体的bean解析流程

在上篇文章中已经看到了Spring中对根元素的解析过程,接下来看一下bean的具体解析过程。1、解析三个属性:id、name和别名: // BeanDefinitionParserDelegate // 具体的一个元素解析 // 本函数主要解析三个属性:id、name和别名 public BeanDefinitionHolder parseBeanDefinitionElement(

2018-01-26 14:44:41 150

原创 5、IoC容器的初始化(4)-由Document解析根节点

本文主要讨论Document的根元素解析过程。 1、调用XmlBeanDefinitionReader中的registerBeanDefinitions方法,注册包含在给定DOM文档中的BeanDefinitions。  // XmlBeanDefinitionReader中 // 注册包含在给定DOM文档中的bean定义。 public int registerBeanDefin

2018-01-26 14:35:09 134

原创 4、IoC容器的初始化(3)-配置文件的读取

配置文件的读取主要干两件事:1、确定读取方式;2、把XML文件中的信息封装到DOM对象中。1、 确定读取方式;它的读取入口应该是DefaultResourceLoader类中的getResource(String location)方法,这里面主要是在确定确认读取方式 // DefaultResourceLoader中 // 判断bean文件的资源对象的定位方式,使用对应的资源获取

2018-01-26 14:24:43 141

原创 3、IoC容器的初始化(2)-BeanFactory创建和Bean Definition的定位资源加载

在前面IoC容器的初始化(1)中FileSystemXmlApplicationContext构造函数中的前两个方法super(parent);和setConfigLocations(configLocations);,接下来继续看refresh(); refresh();方法实现在AbstractApplicationContext类中,它是一个模板方法。它的主要作用的是两个:1、建立一

2018-01-26 14:16:10 160

原创 2、IoC容器的初始化-初始化资源加载器和上下文

这篇以及后面的几篇blog,都将讨论ApplicationContext初始化过程,其大致流程就需要完成与BeanDefinition相关的三件事1、Resource定位;2、载入;3、注册。下面主要以FileSystemXmlApplicationContext类为例1、 定位资源: ApplicationContext context = new FileSystemXmlAp

2018-01-26 13:44:12 187

原创 1、Spring IOC体系

在Spring IOC体系中最重要的两个部分就是BeanFactory和BeanDefinition。BeanFactory:BeanFactory是一系列工厂的接口,典型的工厂模式,BeanFactory来实例化、配置和管理对象。BeanFactory和很多具体的实现类,先来看一下BeanFactory接口本身的定义,它直接定义了IOC容器的基本行为。 public interf

2018-01-26 13:21:57 162

原创 5_策略模式

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。 策略模式最大价值就是干掉了选择,特别是switch,通过这种模式,可以干掉在代码在switch中的强耦合关系。按照惯例,还是来个生活写照:有一个国际的税务组织,需要和各国的税务规则打交道,每个国家都有自己的税务体系,需要根据实际的业务使用对应的税法规则。用代码来模拟这个业务,一种简单的实现如下(把对应的国家信息传

2018-01-17 09:38:11 175 1

原创 4_模板方法

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。Template Method的核心观点就是把一般的操作步骤定下来,具体细节不管。一个现实中的例子就是买火车票(从本地出发),假设角色有老师和学生,买票方式有线上和线下。那么可以分为4种情况:1、老师线上买票;2、学生线上买票;3、老师线上买票;4、学生线上买票;虽然有4种情况,但是当我们对买票的步骤进行一些抽象,却发

2018-01-16 21:27:54 139

原创 3_观察者模式

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。观察者模式就是现实生活情景的一个写真。在现实生活中有这样一个场景,就是在医院等待检查报告,等待的病人或者家属怎么知道报告已经出来了呢?有两种解决方案:1、 每个病人或者家属每隔一段时间就去问,护士就根据已经出来的报告进行回答,这样就搞定了。2、 每个病人或者家属都坐着等,护士每拿到一份报告就喊报告上面病人的名字,病人或

2018-01-14 20:49:48 144

原创 2_工厂方法

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。 工厂方法的核心思想就是自己不直接”new”对象,而是通过发送一些信息,问其他对象要。举个例子:有个商贸市场,用”new”的方式就是类似把生产基地建设在商贸市场里面,客户要什么,就生产什么。而通过工厂方法就是把工厂搬出去,我只要根据用户需求提交订单向工厂即可。这样商贸市场就只需要做两个动作,接收用户请求和提交订单。把变化“

2018-01-13 14:31:44 193

原创 1_我对设计模式的思考

一直都对设计模式有一种膜拜之情,觉得设计模式是一种高深的技术,一年前大致看了一遍23种设计模式觉得就是一些固定调用,继承,派生的方式,以为记住就可以了。而对设计原则和设计思想视而不见。再经过了一年的学习和项目经验后在来重新学习设计模式,发现自己有了一些新的思考:1、 设计模式是思想,不是固定套路。是为了更好地让代码适应变化。2、 设计模式是为了应对局部变化而产生的。如果程序没有变化,那

2018-01-13 11:48:01 235

原创 struts2原理模拟

Struts2的核心:Struts2的设计目的是提取Servlet的公共功能,达到简化Servlet的目的。核心思想就是设计一个在Servlet执行之前先做一些工作,比如设置编码,接收参数,还有结束之后的跳转等等。核心实现方式就是添加一个filter,完成上述功能。图一:Struts2核心原理Struts2的核心功能分析:1、 跳转:当一个用户请求的URI来了经过过滤器

2017-12-11 15:10:27 292

原创 8-ClassLoader

ClassLoader的核心作用是:加载指定路径的classJVM将所需要运行的*.class文件加载到JVM进程中需要有一个类加载器(ClassLoader,系统会提供默认类加载器,我们也可以自己写),类加载器的好处就在于我们可以随意指定*.class文件的位置(包括网络上的)。类的初始化时间调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导

2017-12-08 22:25:19 159

原创 7-类的加载、连接、初始化

Java虚拟机的生命周期   在下面的集中情况下会结束java虚拟机1、 执行了System.exit()2、 程序正常结束3、 程序在运行过程中遇到的异常或错误而异常终止4、 由于操作系统出现错误  类的加载、连接、和初始化加载:查找并加载的类二进制数据(加载到内存)将类的class文件中的二进制数据读入到内存中,将其运行时数据区的方法区,然后在堆内存上创

2017-12-08 21:04:39 203

原创 6-java引用类型

Java引用概述引用是开发的灵魂,直接决定了对象占用内存的时间,在JDK1.2之后提出了四种引用方式1、 强引用:当JVM空间不足,JVM宁可出现OutOfMemoryError错误停止,也需要空间保存,并且不回收空间 Object obj=new Object()2、 软引用:当内存不足,进行对象回收处理,往往用于高速缓存Mybaits3、 弱引用:不管内存是否紧张,有垃圾就回收

2017-12-08 20:03:53 155

原创 5-JVM的GC算法(3)

本文主要介绍G1收集器的核心思想和工作过程。

2017-12-08 19:22:57 160

原创 4-JVM的GC算法(2)

新生代可用的GC策略 首先介绍一种Stop-The-World(STW):Java中一种全局暂停的现象,全局停顿,所有Java代码停止,native代码可以执行,但是不能和JVM交互。这个过程多半由于GC引起,包括:(1)Dump线程;(2)死锁检查;(3)堆Dump。 串行GC(Serial Copying)复制(Copying)清理算法A、 扫描年轻代中所有存活的对象;B、 使用Minor G...

2017-12-08 17:53:18 219

原创 3-JVM的GC算法(1)

GC算法概述:JAVA语言最大的特点在于具备良好的垃圾收集特点,也就是GC是整个java之中最重要的安全保证,帮助开发者写出合理的代码。整个JVM中的GC处理机制:对不需要的对象进行标记,而后进行清除。 堆内存的划分图一:java堆内存的划分 1.8之后永久代改成了元空间 永久代只有HotSpot中有  Oracle 试图将HotSpot和JRockit的标准合并为一个

2017-12-08 17:27:47 199

原创 2-jvm概述

JVM的运行的流程:图一:JVM运行流程所有的Java程序必须保存在*.java的文件之中,称为源代码。这些源代码不能直接执行,必须使用javac.exe命令把源代码编译成为*.class文件(编译器)。使用java.exe命令在JVM进程中解释此程序。 JVM将所需要运行的*.class文件加载到JVM进程中需要有一个类加载器(ClassLoader,系统会提供默认类

2017-12-08 12:02:10 185

原创 1-我眼中的jvm

JVM的封装思想在我的眼中,jvm很类似操作系统,都是在干管理内存,控制线程和并发的工作,只是OS还要管理外设,而jvm没有干这个活,笔者认为它俩之间的核心本质是一样的,就是封装。 操作系统是面向硬件的封装一个例子:对于用户而言,操作系统提供了操作硬件的接口,一个printf(“操作系统”); 就搞定了文字到0,1数据流再到像素点阵的转换,”操作系统”先在内存中被转化成0/1数据流

2017-12-08 11:19:54 125

原创 网络层-8、ICMP

ICMP是互联网控制报文协议,支持主机或者路由器。这种协议报文主要分两种:差错报告报文和网络探寻报文,在这里,差错报告报文又可以分五种,网络探寻报文可以分两种。差错报告报文:1、 目的不可达:报文达到目的主机,但是不能向上交付。2、 源抑制:类似TCP协议的拥塞控制,通过反馈网络环境的拥塞情况,控制发射源的速率,但是现在已经不使用了。3、 超时/超期:在IP数据报的头部有个RTT来

2017-09-28 17:46:11 531

原创 网络层-7、网络地址转换-NAT

参考哈工大公开课。网络地址转换(NAT)的核心网络地址转换的核心思想就是在局部范围内用私有网络IP(外部无法访问),可以在这个局部范围内相互访问,但是如果需要访问外部的资源就需要通过一个统一的对外公布的非私有的IP地址进行数据交换。这个好比一群人被关在一个封闭的房子里面,声音传不出去,房间里面只有一个电话,每个人在房间内可以随意交流,但是要对外交流就必须通过这部电话机了。图

2017-09-28 17:36:46 419

原创 网络层-6、IP地址动态分配—DHCP

IP地址动态分配—DHCP

2017-09-28 17:30:33 845

原创 网络层-5、CIDR与路由聚合

CIDR与路由聚合。

2017-09-28 17:25:46 3692

原创 网络层-4、IP地址和IP子网

IP地址和IP子网。

2017-09-28 17:18:50 333

原创 网络层-3、IP数据报结构和IP分片

IP数据报结构和IP分片。

2017-09-28 17:09:28 1324

原创 网络层-2、虚电路网络&数据报网络

虚电路网络&数据报网络。

2017-09-28 16:58:09 5763

原创 网络层-1、网络层功能概述

网络层功能概述

2017-09-28 16:52:01 5493

原创 传输层-5、网络拥塞原因和TCP拥塞控制

网络拥塞原因和TCP拥塞控制。

2017-09-20 17:52:10 2899

原创 传输层-4、TCP协议

TCP协议介绍。

2017-09-20 17:43:15 261

原创 传输层-3、流水机制和滑动窗口协议

传输层的流水机制和滑动窗口协议。

2017-09-20 17:33:06 454

原创 传输层-2、可靠数据传输原理与实现

可靠数据传输原理与实现。

2017-09-20 17:23:56 1204

原创 传输层-1、UDP协议

UDP协议。

2017-09-20 17:19:12 273

空空如也

空空如也

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

TA关注的人

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