自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 spring bean创建过程五

继续上次的源码分析: 分析到这里了

2021-06-10 23:28:03 116

原创 spring bean创建过程四

继续创建Bean的过程,1 通过默认的构造方法实例化对象下面准备一个案例

2021-06-01 23:28:17 138 2

原创 spring bean创建过程三

接下来讲解在创建bean过程,可能会提前创建,下面开始一个案例定义一个类:BeforeInstantiation定义一个拦截器定义一个类,实现InstantiationAwareBeanPostProcessor接口再来看下BeanPostProcessor接口,可以看到InstantiationAwareBeanPostProcessor接口是BeanPostProcessor的子接口,所以我们定义的类实现了5个方法开始断点看源码:我们知道BeanPo...

2021-05-27 23:27:04 195 4

原创 spring bean的创建过程二

我们知道bean的创建过程主要是getBean->doGetBean->createBean->doCreateBean开始进入源码,断点查看先从缓存中获取单例对象getSingleton并没有,直接返回为指定的Bean标记为已经创建(或将要创建)下面将进入创建bean此处需要注意:ObjectFactory接口先来看下ObjectFactory源码这个接口的定义非常简单,就是一个对象工厂,定义了一个返回.

2021-05-20 23:41:22 215 3

原创 spring bean的创建过程一

本章主要讲解三个知识点1 ConversionService相关知识2 getMergedLocalBeanDefinition方法分析3 FactoryBean源码分析下面开始讲bean的创建过程,首先定位到源码:1 先讲一下ConversionServiceSpring在convert.converter中定义了3中类型的转换器接口,实现其中任何一个接口,然后将其注入到ConversionServiceFactoryBean当中就可以使用。Converter<S

2021-05-18 23:57:57 195 3

原创 spring 事件监听

1 观察者模式先来看下观察者模式,举个例子警察和军人是观察者,犯罪嫌疑人是被观察者代码实现:定义被观察者接口:定义观察者接口定义坏人定义好人:定义好人2:测试:或者用JDK自带的观察者模式定义坏人:定义好人:测试:结果:最后来总结一下,看下spring的事件spring事件:下面来看下源码1 初始化事件广播器可以看到如果没有自定义的事件广播器,默认是使...

2021-05-10 23:05:34 188 2

原创 Spring 的registerBeanPostProcessors方法分析

本方法会注册所有的 BeanPostProcessor,将所有实现了 BeanPostProcessor 接口的类加载到 BeanFactory 中。BeanPostProcessor接口是 Spring 初始化bean 时对外暴露的扩展点,Spring IoC 容器允许BeanPostProcessor在容器初始化bean的前后,添加自己的逻辑处理。在 registerBeanPostProcessors 方法只是注册到 BeanFactory 中,具体调用是在bean 初始化的时候。...

2021-05-06 20:45:59 965

原创 Spring注解解析之ConfigurationClassPostProcessor

ConfigurationClassPostProcessor会处理所有BeanDefinition中的符合注解条件的BeanDefinition,(@Configuration注解的、@Component、@ComponentScan、@Import、@ImportResource或者@Bean注解的),使用ConfigurationClassParser解析出javaconfig配置类,使用ConfigurationClassBeanDefinitionReader加载。先来提个问题:相信很多同

2021-04-18 16:28:58 296

原创 spring BeanFactoryPostProcessor自定义扩展和执行流程

继续分析BeanFactoryPostProcessor的执行流程如何向beanFactoryPostProcessors中添加自定义的BeanFactoryPostProcessor1 先自定义一个MyBeanFactoryPostProcessor类,实现BeanFactoryPostProcessor接口2 在自己的MyClassPathXmlApplicationContext类中,customizeBeanFactory方法中添加:super.addBeanFactoryPostP

2021-04-14 23:28:19 1068 1

原创 spring invokeBeanFactoryPostProcessors 执行流程执行流程分析

先自定义扩展一个BeanFactoryPostProcessor1 定义一个MyBeanFactoryPostProcessor,实现BeanFactoryPostProcessor接口2 在代码中添加:addBeanFactoryPostProcessor(new MyBeanFactoryPostProcessor())或者直接在配置文件中定义<bean id="myBean" class="com.lyh.MyBeanFactoryPostProcessor" >&

2021-04-12 23:09:59 267

原创 spring 自定义属性编辑器

我们在xml定义bean时,输入的内容都是字符串。spring会根据已经注册好的属性编辑器解析这些字符串,实例化成对应的类型。下面看一个具体案例,Customer有一个属性Address,根据自定的属性编辑器生成Address对象,并解析出“省市区”。步骤如下:1 自定义一个实现了PropertyEditorSupport接口的编辑器2 让Spring能够识别到此编辑器,自定义实现一个属性编辑器的注册器,实现了PropertyEditorRegistrar接口3 让spring能够识别到对应

2021-04-11 18:34:18 2918

原创 spring parseCustomElement 源码分析和扩展自定义标签

本节主要讲parseCustomElement 解析自定义标签和扩展自定义标签,找到方法这里需要注意的是readerContext对象是前面已经实例化了的,createReaderContext方法中创建的,如下图:我们再看下方法:getNamespaceHandlerResolver,这里注意看下变量:DEFAULT_HANDLER_MAPPINGS_LOCATION的值:META-INF/spring....

2021-04-09 21:03:44 174

原创 spring配置文件加载 loadBeanDefinitions分析

下面来分析loadBeanDefinitions方法,如下图:loadBeanDefinitions(beanFactory);,这里的beanFactory是对象DefaultListableBeanFactory,这个对象是具体实际干活的类,重点看loadBeanDefinitions方法,这里比较关键的是判断是否是默认的命名空间,如果是默认的命名空间则调用parseDefaultElement...

2021-03-31 23:57:45 454

原创 spring 扩展点 initPropertySources,customizeBeanFactory

一: initPropertySources在AbstractApplicationContext类中有一个initPropertySources方法是留给子类扩展,它是在refresh()的第一个方法prepareRefresh();方法中调用。所以我们可以继承此类或其子类来重写initPropertySources方法,实现一些扩展。下面来测试:二:customizeBeanFactory在AbstractRefreshableApplicationContext类中

2021-03-29 22:24:25 541

原创 spring setConfigLocations方法分析

进入ClassPathXmlApplicationContext的构造方法,如下图:setConfigLocations我们用一个案例来调试看看情况:定义一个spring-${username}.xml的文件resolvePath方法:进入方法:getEnvironment,创建一个ConfigurableEnvironment类,这个类很重要进入方法createEnvironment,产生一个StandardEnvironment类,但是..

2021-03-26 22:00:31 1026

原创 spring IOC源码整体流程

源码入口先从new ClassPathXmlApplicationContext("test.xml");开始打断点进去看。这里先大概过一下流程,后续再细讲,主要看refresh方法,@Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor)...

2021-03-24 20:46:51 266 1

原创     spring 源码概述

spring 源码概述spring 大致分为IOC和AOP,如下图:IoC:通过容器去控制业务对象之间的依赖关系。控制权由应用代码中转到了外部容器,控制权的转移就是反转。控制权转移的意义是降低了类之间的耦合度。创建对象的时候,向类里面的属性设置值。spring依赖注入主要是两种方式:(...

2021-03-19 20:37:23 425

原创 redis 高级应用

1 发布/订阅类似于MQ的主题模式-只能消费订阅之后发布的消息,一个消息可以被多个订阅者消费普通的发布/订阅  除了实现任务队列外,redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式。"发布/订阅"模式同样可以实现进程间的消息传递,其原理如下:普通的发布/订阅  除了实现任务队列外,redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式。"发布/订阅"模式同样可以实现进程间的消息传递,其...

2020-07-06 18:52:24 462

原创 redis-value数据结构list,hash,set ,sorted set

1 List数据结构在版本3.2之前,Redis 列表list使用两种数据结构作为底层实现:压缩列表ziplist 双向链表linkedlist因为双向链表占用的内存比压缩列表要多, 所以当创建新的列表键时, 列表会优先考虑使用压缩列表, 并且在有需要的时候, 才从压缩列表实现转换到双向链表实现。 压缩列表转化成双向链表条件 创建新列表时 redis 默认使用 redis_encoding_ziplist 编码, 当以下任意一个条件被满足时, 列表会被转换成 redis_encod

2020-07-06 15:03:02 379 1

原创 Redis 简单认识和String字符串类型

1Redis中16个默认数据库Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置。客户端与Redis建立连接后会默认选择0号数据库,不过可以随时使用SELECT命令更换数据库。# 切库redis> SELECT 1 # 默认0号db,切换为2号由于Redis不支持自定义数据库的名字,所以每个数据库都以编号命名。开发者则需要自己记录存储的数据与数据库的对应关系。另外.

2020-07-04 17:52:57 340

原创 redis 简单入门安装

1 redis简单介绍可以打开这个网站:https://db-engines.com/en/,里面有所有数据库的一些排名和每个数据库的介绍1.1打开网站看到所有数据库的排名,包括redis的排名1.2 key/value存储,redis排名第一1.3 https://db-engines.com/en/system/Redis里面很多redis的特性介绍,这里不一一介绍英文网站:https://redis.io/中文网站:http://www.redis.cn/2 ...

2020-07-04 10:02:33 91

原创 springboot 多环境开发和配置文件优先级

1 springboot 多环境设置切换1.1分别创建对应的配置文件1.2 在application.properties: spring.profies.active=环境名1.3 .yml文件也是一样的,这里就不写了。2 配置文件优先级2.1 SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同配置文件目录,可放置目录(优先级从高到低)file:./config/ (当前项目路径config目录下);file:./ (当前项目路径下).

2020-06-28 16:23:05 608

原创 JVM垃圾回收一个简单案例分析

1 HotSpot参数分类> 标准: - 开头,所有的HotSpot都支持> 非标准:-X 开头,特定版本HotSpot支持特定命令> 不稳定:-XX 开头,下个版本可能取消java -X 查看标准参数2 通过实验来认识JVM参数public class HelloGC {public static void main(String[] args) {System.out.println("HelloGC...

2020-06-23 20:31:46 398

原创 常见的垃圾回收器

常见的垃圾回收器如下图:1 新生代垃圾收集器 1.1 Serial 收集器复制算法Serial 是一款用于新生代的单线程收集器,采用复制算法进行垃圾收集。Serial 进行垃圾收集时,不仅只用一条线程执行垃圾收集工作,它在收集的同时,所有的用户线程必须暂停(Stop The World)。如下是 Serial 收集器和 Serial Old 收集器结合进行垃圾收集的示意图,当用户线程都执行到安全点时,所有线程暂停执行,Serial 收集器以单线程,采用复制算法进行垃圾收集工...

2020-06-22 20:36:00 270

原创 JVM垃圾回收算法

1.什么是垃圾没有任何引用指向的一个对象或者多个对象(循环引用)2 如何定位垃圾2.1引用计数(ReferenceCount)在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,引用失效时就减1.任何时刻计数器为0的对象就是不可能再被使用的。这个方法效率挺高,大部分情况下也是很不错的算法。但是在JVM中会很难解决对象之间相互循环引用的问题,就如果两个对象之间相互调用,这时候就会发生类似死锁的情况,即这个地方相互调用会使得引用计数法始终认为有对象在引用当前对象,就一直计数.

2020-06-22 20:18:25 166

原创 运行时数据区简单介绍(上)

JVM1.8之后的内存布局:JDK8 之前的内存区域图如下:本文先介绍JVM内存五大部分的程序计数器,虚拟机栈和方法区,其它三部分下篇详细介绍。我们把程序代码抽象一下,可以理解为由三个部分组成,分别是数据、指令、控制流,所谓数据,可以理解为定义的成员变量,静态变量,常量;指令理解为在方法中执行的语句,控制流理解为分支、循环、跳转、异常处理、线程恢复等。程序计数器程序计数器是一块较小的内存空间,指的是当前线所执行的字节码的行号指示器。这是比较官方的解释,通俗一点来...

2020-06-22 16:35:11 563

原创 Java对象在内存中的布局

先看两个问题:1 对象的创建过程?Objectt = new Object();首先创建对象的时候,会先检查对象的class类有没有加载过,如果没加载过就执行类加载过程class loading(加载)通过一个类的全限定名来获取类的二进制字节流并未指定总哪获取,怎么获取。所以字节流可以是存储在硬盘上的文件,可以是运行时动态生成的二进制字节流,可以是有其他文件生成的(JSP对应的class文件)等等将字节流代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个.

2020-06-20 18:38:08 842

原创 乱序问题-内存屏障认识

乱序问题CPU为了提高指令执行效率,会在一条指令执行过程中(比如去内存读数据(慢100倍)),去同时执行另一条指令,前提是,两条指令没有依赖关系。对于现代cpu而言,性能瓶颈则是对于内存的访问。cpu的速度往往都比主存的高至少两个数量级。因此cpu都引入了L1_cache与L2_cache,更加高端的cpu还加入了L3_cache.很显然,这个技术引起了下一个问题:如果一个cpu在执行的时候需要访问的内存都不在cache中,cpu必须要通过内存总线到主存中取,那么在数据返回到cpu...

2020-06-20 16:36:19 870

原创 MESI--CPU缓存一致性协议浅谈

CPU为何要有高速缓存现代处理器为了提高访问数据的效率,在每个CPU核心上都会有多级容量小,速度快的缓存(分别称之为L1 cache,L2 cache,多核心共享L3 cache等),用于缓存常用的数据。由于内存的速度要比CPU慢将近100倍,数据被修改时也只是先更新cache,并不是直接写回到主存中(CPU是不能直接跟内存进行通信的,CPU只对接cache,然后由cache对接主存),这样一来就造成了缓存中的数据与内存不一致。如果系统是单核处理器,所有线程看到的都是缓存中的最新数据,当然没有问题。但如

2020-06-20 15:33:29 334

原创 Class类加载过程、类加载器简单介绍

类加载机制ClassLoaderClassLoader 就是类加载器,它的唯一职责就是将Class文件加载到JVM中,通常开发者并不需要自己创建ClassLoader,但在框架、中间件中自定义ClassLoader 非常常见,Tomcat便极具代表性,通过自定义的Tomcat Classloader体系实现应用的相互隔离。在 Java 中默认提供了三个类加载器,分别是BootstarapClassLoader、ExtClassLoader、AppClassLoader,它们各自只负载...

2020-06-19 16:13:09 642

原创 Class File Format 简单认识

概述Class文件是一组以8位字节为基础单位的二进制流,可以用Hex Friend等工具打开。CLass结构:无符号数:基本类型,u1,u2,u4,u4分别代表一个字节、两个字节、四个字节、八个字节的无符号数。表:多个无符号数或者其他表作为数据项构成的复合数据类型,习惯以_info结尾,整个class文件本质上就是一张表。class具体结构魔数每个class文件的头4个字节称为魔数,它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件,大部分文件存储标准都..

2020-06-18 19:04:40 354

转载 Executor框架和线程池简单介绍

Executor框架Executor是一个接口,仅要求实现void execute(Runnable command);,要求是在各种场合(新开的线程、线程池内等等),同步(在execute方法里立刻执行)或异步得完成某一任务。自己定义类实现Executor接口:public class T_MyExecutor implements Executor {@Overridepublic void execute(Runnable command) {...

2020-06-17 19:10:38 269

原创  面试题:要求用线程顺序打印A1B2C3....Z26

1 用synchronized+wait()+notify()实现public class T_Sync_wait_notify {public static void main(String[] args) {final Object o = new Object();char[] aI = "1234567".toCharArray();char[] aC = "ABCDEFG".toCharArray(...

2020-06-16 19:52:26 353

原创  常见的Queue介绍

queue常用方法:remove:从队列中删除第一个元素,不存在报错。poll:从队列中删除第一个元素,不存在返回null。peek:查询第一个元素,不存在返回null。add:往队列加一个元素,队列满报异常。offer:往队列加一个元素,队列满返回false;put: 往队列加一个元素,队列满时阻塞,直到队列有新的空间。take:从队列中拿取第一个元素,队列为空则阻塞到队列有元素为止。PriorityQueue,即优先队列。优先队列的作用是能...

2020-06-16 17:33:02 2325

原创 CopyOnWriteArrayList简单认识

1、ArrayList非线程安全的缺陷说到这个容器,从名字就可以看出,不得不说另外一个容器,也就是ArrayList。ArrayList是非线程安全的,也就是说在多个线程下进行读写,会出现异常。先举一个简单的例子,看看会出现什么问题100个线程,每个线程都往集合里面添加1000个数据public class T_CopyOnWriteList {public static void main(String[] args) {List<...

2020-06-16 16:51:48 292

原创 模拟火车票买票案例

有N张火车票,每张票都有一个编号,同时有10个窗口对外售票,请写一个模拟程序1 用ArrayList实现public class TicketSeller1 {static List<String> tickets = new ArrayList<>();static {SortedMap s = new TreeMap();for (int i = 0; i < 100...

2020-06-15 17:47:25 1136

原创  Hashtable、HashMap、Collections.synchronizedMap()、ConcurrentHashMap 读写性能比较

1 写性能,100万个数据,开启100个线程去写1.1 Hashtablepublic class T_Hashtable {static Hashtable<UUID, UUID> m = new Hashtable<>();static int count = Constants.COUNT;static UUID[] keys = new UUID[count];static UUID[...

2020-06-15 17:22:12 794

原创 常见集合容器类简单总结

1 常见集合类,容器汇总如下:1 collection集合类List 列表,有序,可重复Queue 队列,有序,可重复Set 集合,不可重复 List Vector ,比较早的集合类了,是JDK1.0版本添加的类,他继承于AbstractList,实现了接口库List,RandomAccess,和Cloneable。Vector实现了List,所以它能够为队列提供:增加,删除,修改,遍历等操作。Vector实现RandomAccess接口,他使队列能够快速访..

2020-06-15 16:20:33 1104

转载 ReentrantLock实现原理及源码分析

ReentrantLock是基于AQS的,AQS是Java并发包中众多同步组件的构建基础,它通过一个int类型的状态变量state和一个FIFO队列来完成共享资源的获取,线程的排队等待等。AQS是个底层框架,采用模板方法模式,它定义了通用的较为复杂的逻辑骨架,比如线程的排队,阻塞,唤醒等,将这些复杂但实质通用的部分抽取出来,这些都是需要构建同步组件的使用者无需关心的,使用者仅需重写一些简单的指定的方法即可(其实就是对于共享变量state的一些简单的获取释放的操作)。公平锁内部是FairSync,非公

2020-06-11 20:50:53 257

原创 JAVA四种引用介绍

1 强引用Object o = new Object(); // o就是强引用最普遍的一种引用方式,如String s = "abc",变量s就是字符串“abc”的强引用,强引用不会被GC回收,并且在java.lang.ref中也没有实际的对应类型。如果一个对象具有强引用,就以为着必不可少,垃圾回收器不会回收它。```当内存不足时java虚拟机宁可抛出OOM错误,使程序终止,也不会随时回收强引用对象```。2 软引用(SoftReference)软引用是用来描述一些还有用但并非必须的对象..

2020-06-11 17:55:20 186

空空如也

空空如也

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

TA关注的人

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