自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring(十):alias标签、import标签和beans标签的解析

回顾alias标签解析检查是否有循环引用问题总结一下import标签解析Beans标签解析回顾前面几篇,将Bean的标签解析整个流程弄懂了,但对于整个XML配置文件的解析是包括以下标签的bean:用于创建IOC容器创建对象alias:用于给Bean起别名import:用于导入其他配置文件(有时候我们喜欢将Spring的配置文件分开单独处理,比如mybatis整合是一个文件、springmvc的整合又是另外一个文件,但Spring读取只会解析一个总文件,所以我们可以在总文件使用import标签导.

2021-09-28 23:20:43 1665

原创 Spring(九):Bean创建的最后一步——通知监听器

回顾通知监听器对Bean的解析及注册完成EmptyReaderEventListenerCollectiongReaderEventListener回顾前面我们已经看了一个Bean的注册流程注册BeanName注册Bean的别名认识了一个重要的对象GenericApplicationContext,这个对象装饰了BeanFactory(DefaultListableBeanFactory),通过这个ApplicationContext去与IOC容器(DefaultListableBeanFa.

2021-09-28 23:17:27 720

原创 JDK1.8新特性(三):并行流、串行流与Optional容器

并行流、串行流并行流Fork/Join框架串行流Optional容器Optional常用方法并行流、串行流前面提到过,JDK1.8提供了StreamAPI,而Stream又分为两种并行流顺序流并行流并行流其实就是把一个内容分成多个数据块,并使用不同的线程分别处理每个数据块的流Fork/Join框架并行流底层的实现就是Fork/Join框架这个框架的本质原理就是将任务不断拆分成小任务(拆到不能再拆),将每个小任务交给多线程去执行,最后进行归并,小任务完成的结果进行合并成大任务的结果多.

2021-09-28 23:14:16 288

原创 JDK1.8新特性(四):接口、线程安全的时间与注解

接口中的默认方法与静态方法线程安全的时间格式化SimpleDateFormat的多线程安全问题解决方案时间类时间戳时间与日期间隔时间校正器:TemporalAdjuster时间格式化:DateTimeFormatter时区处理注解重复注解类型注解接口中的默认方法与静态方法JDK1.8支持在接口中有默认方法与静态方法了,之前接口用只能有抽象方法和静态常量default:修饰接口的默认实现(为了提高兼容性,假如一个接口增加了方法,那么实现类都需要去实现新增的方法,所以添加了默认实现,让以前的实现类不需.

2021-09-28 23:12:57 909

原创 JDK1.8新特性(三):并行流、串行流与Optional容器

并行流、串行流前面提到过,JDK1.8提供了StreamAPI,而Stream又分为两种并行流顺序流并行流并行流其实就是把一个内容分成多个数据块,并使用不同的线程分别处理每个数据块的流Fork/Join框架并行流底层的实现就是Fork/Join框架这个框架的本质原理就是将任务不断拆分成小任务(拆到不能再拆),将每个小任务交给多线程去执行,最后进行归并,小任务完成的结果进行合并成大任务的结果多线程的好处就是可以尽量避免由于阻塞带来的性能浪费,而且还有一个任务偷窃的效果,CPU将任务放入线

2021-09-27 23:15:02 486

原创 # JDK1.8新特性(二):Stream API

Stream对Stream的操作获取Stream操作中间操作,一系列流水操作过滤、截断、跳过、筛选过滤:stream的filter方法截断:stream的limit方法跳过:stream的skip方法筛选:stream的distinct方法映射排序中止操作allMatchanyMatchnoneMatchfindFirstfindAnycountmaxmin归约与收集归约map-reduce模式收集归约与收集的区别Java8两个最为重要的改变Lambda表达式Stream APIStream.

2021-09-27 21:59:35 713

原创 Spring(八):注册Bean

回顾注册BeanDefinition根据Bean的名字进行注册总结一下根据Bean的名字进行注册根据Bean的别名进行注册回顾spring解析Bean主要分为三步创建普通的BeanDefinition(解析默认的属性、XML标签)修饰创建出来的BeanDefinition(解析自定义的属性和标签)注册BeanDefinition下面就来看一下如何进行注册的!对应代码就是下面这一行,注册BeanDefinition可以看到,解析和修饰BeanDefinition都是交由delegate.

2021-09-27 21:15:59 1015 1

原创 Spring(七):修饰Bean(自定义标签与属性的解析)

回顾AbstractBeanDefinition下一步:对创建的BeanDefinition进行修饰修饰子标签与属性总结一下回顾前面两节已经看完了对一个Bean标签的解析了,至此一个完整的GenericBeanDefinition就诞生了,完成了从XML文档到GenericBeanDefinition的转换,现在XML的所有配置,我们都可以从GenericBeanDefinition中找到对应的配置但其实,GenericBeanDefinition只是一个子类而已,大多数的实现细节还是在Abstra.

2021-09-25 15:17:57 447

原创 Spring(六):Bean标签解析(三)

回顾解析property标签parsePropertyElements方法parsePropetyElement方法parsePropertyValue方法PropertyValue是怎样被记录的?解析qualifier标签parseQualifierElement方法回顾前面已经看了父Bean标签对下面几种标签的解析meta标签lookup-method子标签replaced-method子标签construct-arg子标签(构造器注入)这几种标签,其实不都怎么常用,通常我们使用最多.

2021-09-23 22:05:42 840 1

原创 JDK1.8新特性(一):lambda表达式

lambda表达式总结:lambdaJava8的四大内置核心函数式接口方法引用与构造器引用方法引用第一种引用第二种引用第三种引用构造器引用数组引用lambda表达式概念:lambda表达式是一个匿名函数,**可以理解成lambda是一段可以传递的代码!**可以写出更简洁、更灵活的代码。提升java的语言表达能力lambda表达式常用于函数式接口,也就是只有一个抽象方法的接口,简化了匿名内部类的使用!比如Compartor接口演化过程比如Compartor接口再没有Compartor接口前,.

2021-09-23 17:45:18 373

原创 Spring(五):bean标签解析(二)

解析其他标签开启追踪、并获取class和parent属性创建用于属性承载的BeanDefinitionAbstractBeanDefinitioncreateBeanDefinition方法解析各种属性parseBeanDefinitionAttributesscope作用域与init-method、destory-method生命周期parseMetaElementsparseLookupOverrideSubElementsparseReplacedMethodSubElementsparseCons.

2021-09-16 22:18:02 733

原创 设计模式(五):建造者模式

依赖倒转原则抽象不应该依赖细节,而细节需要依赖抽象对于建造者模式来说,就是将工作的流程抽象起来,具体的工作细节都依赖于这个抽象建造者模式概念比如建造一个产品,该产品是由一系列工件组装成的,但是对于该产品的不同系列,有一些工件是不同型号的,当我们使用程序去表达建造产品的这些过程,一般来说对于每一个工件就是一个类,然后给一个具体产品去嵌入这个类,比如一个A产品,嵌入了A工件的头部、A工件的手部等。。。。假如我们后面再去建造一个新产品,又要去给新产品重新嵌入,这样很容易会出现问题,即容易丢失工件,有一些

2021-09-16 16:53:47 153

原创 设计模式(六):观察者模式(发布订阅模式)

双向耦合观察者模式总结一下什么时候可以使用观察者模式呢?观察者模式的不足事件委托实现委托事件本质首先来说一下什么是观察者模式,观察者模式其实跟消息发送器差不多,观察者觉察到了事件发生,就去通知其他人该事件,说白了担任的角色跟晚修课上时刻注意级长来了的同学一样双向耦合假如我们去实现观察者模式的时候,通常需要两个部分观察者:观察事件是否发生,其实本质上是监听通知者通知者:通知者要去通知观察者事件发生这就涉及到一个双向耦合的问题,当新增一个观察者,或者新增一个通知者时,两方都要进行修改的!新.

2021-09-16 16:52:43 274

原创 MyBatis(四):参数处理器

回顾参数处理器(ParameterHandler)DefaultParameterHandlertypeHandler去匹配参数setParameter方法前面已经提到了,StatementHadnler会调用参数处理器和结果集映射器来分别做SQL参数的匹配(JavaBean转化成JDBC的参数),和SQL查询出来的结果集转换成JavaBean下面就来看看参数处理器回顾下面就来看看这个过程如何,之前去执行Executor执行doQuery方法时,在生成prepareStatement时,会调用pa.

2021-09-14 18:09:03 412

原创 Spring(四):bean标签解析

回顾Bean标签的解析及注册parseDefaultElement方法nodeNameEquals方法(判断当前的标签是什么标签)解析Bean标签processBeanDefinition方法解析BeanDefinition进一步解析bean中的其他属性回顾前面我们也已经看到了,Spring的注册Bean的大概流程选择XML的校验模式(有DTO选DTO,没有就为XSD)使用DefaultLoadDocument解析Dom对象注册Bean解析Profiles属性(判断当前激活环境是否符合Pr.

2021-09-14 16:02:35 607

原创 Spring(三):Dom解析与注册流程分析

获取Dom信息并注册获取XML的验证模式DTO和XSD验证模式的区别验证模式的获取getValidationModeForResource配置文件去获取validationMode(detectValidationMode方法)ValidationModeDector的detectValidationMode方法解析DocumentDefaultLoadDocumentEntityResolver对象解析及注册BeanDefinitionsregisterBeanDefinitions方法BeanDefi.

2021-09-12 21:46:04 667

原创 Spring(二):容器的实现——配置文件封装与加载Bean过程

XmlBeanFactory配置文件封装InputStreamSourceResource加载BeanEncodedResourceloadBeanDefinitions方法doLoadBeanDefinitions方法前面认识了两大核心类DefaultListableBeanFactoryXmlBeanDefinitionReader对整体架构有了一定的认识,对容器功能有了大致的认识,下面就来看看容器的基础XmlBeanFactoryXmlBeanFactory是容器的基础,继承了Def.

2021-09-11 11:46:16 569

原创 MyBatis(三):StatementHandler

回顾三部分对应关系StatementHandlerStatementHandler结构PrepareStatementHandler执行流程构建StatementHandlerquery方法实现parameter方法实现回顾MyBatis的执行流程Sqlsession (会话层面,门面模式)-》 Executor(执行器,模板方法,doQuery和query)-》 StatementHandler(JDBC处理器)JDBC分为三部分获取Statement,声明Statement设置Sql参.

2021-09-09 23:07:11 876

原创 Spring(一):容器的实现——两大核心类

分析容器如何实现Spring的结构组成beans包的层级结构核心类DefaultListableBeanFactoryXmlBeanDefinitionReaderXmlBeanDefinitionReader的执行步骤分析容器如何实现在Sping官网中的一段入门代码todo步骤如下读取Spring的配置文件从配置文件中找到对应Bean的信息(bean的那一段信息)根据找到的Bean信息进行实例化Bean所以要想实现容器,至少需要3个类ConfigReader:用来读取和校验配置文.

2021-09-09 21:00:59 835 1

原创 MyBatis(二)缓存

缓存一级缓存命中条件一级缓存源码解析一级缓存结构一级缓存总结一级缓存失效情况Spring集成MyBatis一级缓存失效?Mapper二级缓存二级缓存的定义二级缓存的结构溢出淘汰策略过期清理策略线程安全序列化Cache接口二级缓存命中条件二级缓存的配置二级缓存架构二级缓存执行流程二级缓存源码TransactionalCacheCachingExecutor的query方法TransactionalCache的getObject方法TransactionalCache的putObject方法Transacti.

2021-09-08 22:58:56 1348 1

原创 剑指offer:Day3

题目1解题思路这种题目使用Java的字符串带有API就可以实现class Solution { public String replaceSpace(String s) { return s.replace(" ","%20"); }}题目2解题思路这里我是在索引位置上寻找突破口字符串进行移K位后(i代表位置索引位置)i - k为正数,那么移位后的索引就是这个位置i - k为负数,那么移位后的索引为length + (i - k),相当于从最后面进

2021-09-06 22:52:09 183

原创 剑指offer:Day2

题目1解题思路这道题跟翻转链表比较相似,只不过不需要去修改链表,只需从尾到头去返回每一个节点的值即可第一种解法:使用栈栈的特性是先进后出,所以我们完全可以遍历链表,将链表的值存进栈中,然后再从栈中弹出放进数组里面/** * 使用栈来完成倒序 */class Solution { private Stack<Integer> stack = new Stack<Integer>(); public int[] reversePrint(ListNo

2021-09-06 22:33:15 262

原创 MyBatis(一):BaseExecutor与CachingExecutor

架构执行过程ExecutorBaseExcutorquery方法queryFromDatabase方法SimpleExecutor(默认实现)doQuery方法ReuseExecutordoQuery方法BatchExecutor总结BaseExecutor缓存Caching Executor二级缓存和一级缓存的区别执行缓存的顺序SqlSession调用过程CachingExecutor的query方法架构MyBatis分为4部分动态代理(MapperProxy)SQL会话(SqlSession.

2021-09-05 17:22:04 1088

原创 剑指offer:DayOne

剑指offer:Day1题目1解题思路使用两个栈去实现队列,所以我们要对栈和队列的特性要有所了解栈的特性就是先进后出,而队列的特性是先进先出,假如现在有两个杯子,一个杯子装满了水,怎么利用另外一个杯子去获取装满水的杯子的最下层的水,答案就是:将水转移进另外一个杯子,那么此时杯子的水最上层的就是原先最下层的水就像下面这样给出V1版代码class CQueue { //使用两个杯子 //one杯子用来装水 //two杯子用来置换水 private Stack<I

2021-09-04 22:44:47 289 1

原创 Java并发容器(二):Java并发容器和框架--ConcurrentLinkedQueue(JDK1.7)

并发安全的队列实现ConcurrentLinkedQueue结构拥有的变量属性Node类构造方法入队操作出队操作updateHead方法源码并发安全的队列实现ConcurrentLinkedQueue是一个线程安全的队列,队列的并发不安全性其实也就是会出现覆盖的问题而实现一个线程安全的队列有两种方式去实现,其实总的来说是拥有两种算法一种是阻塞算法,也就是用锁去控制队列的入队和出队,可以是两个锁也可以是一个锁另外一种就是非阻塞算法,采用循环CAS的方式去实现,其实也就是乐观锁而Concurr.

2021-09-04 11:36:36 311

原创 Java并发容器(一):Java并发容器和框架--ConcurrencyHashMap(JDK1.7)

ConcurrentHashMap的实现原理与使用(JDK1.7)ConcurrentHashMap可以理解成是一个并发安全的HashMap在并发编程中,HashMap是不安全的,会导致一个死循环的问题,还有一个并发安全的HashTable,但使用HashTable的效率非常低下(加Synchronic),于是就出现了ConcurrentHashMap线程不安全的HashMap在并发编程中,使用HashMap进行put操作是会引起死循环的,最终结果就会导致CPU利用率接近100%下面分析一下为什么

2021-08-30 22:48:22 570

原创 7.27:修改跨模块调用与List进行过滤总结

修改跨模块调用接口步骤如下:被调用模块进行修改调用模块client进行修改调用模块的调用服务类进行修改被调用模块进行修改比如我这里,是要修改参数,之前使用@RequestParam的,现在改用@RequestBody来接收参数,当然这个模块的service也要进行对应修改,还有把接口url也改了调用模块的client进行修改client端一般都是继承了api的,所以我们要对api进行对应修改修改也是要对应修改的,前面已经提到过调用模块就是根据这个api接口去对应请求另外一个模块的

2021-07-27 17:57:07 177

原创 7.23:SpringCloud跨模块访问

Davco跨模块调用服务需要使用的SQLselect doc.code from BASE_CUST_DOC_DEF doc where doc.id = (select SHOP_TYPE from BASE_CUSTOMER_EXT where id =(select CHANNEL_CUSTOMER_ID from occ_iuap_72.APP_USER " + " where LOGIN_NAME =? ));我们这里将这SQL根据所在的数据库分为两部分访问o

2021-07-27 17:54:00 662

原创 7.23:JPA错误记录

使用Entity进行查询出错具体错误如下可以看到,报错信息是由于davcoRoleRepository注入不进,导致上层的service和controller都注入失败,所以回归到repository层,而repository层是因为Validation failed for query,也就是SQL有问题解决办法:可以看到上面的SQL查询的是Entity,对于字段查询必须要使用别名,所以加上别名即可...

2021-07-27 17:23:04 328

原创 7.21:启动SpringCloud项目并进行后端调试

网关(GateWay)网关:用于进行路由,个人理解是前端是一个项目,在js配置那里进行配置访问路径,访问网关,然后找到对应的服务以上是启动occ-base-web服务,host其实是本机地址,使用127.0.0.1也行,端口号要对应网关模块的配置文件里面的端口号网关映射前端通过网关寻找后端服务,那么就需要有一种后端服务与网关的映射关系,可以让网关找到后端服务我们回到前端的js可以看到里面是访问occ-base路径的服务那么网关就要进行一层映射可以看到,在网关的配置文件有配置进行映射

2021-07-27 17:20:19 2135

原创 7.12:项目环境搭建问题总结

项目maven依赖无法找到引入导师给的maven仓库出现问题,部分依赖无法进行导入解决办法:将这里改成自己项目的JDK提示启动命令过长-Command too long改为使用Jar形式启动启动服务后,进入Eruker注册中心,ip地址不对应可能是电脑启动了虚拟机,把虚拟机关掉...

2021-07-27 17:10:20 191

原创 Java并发(十):独占式超时获取同步状态

独占式超时获取同步状态doAcquireNanosspinForTimeoutThresholdparkNanoscancalAcquire前面已经看过了整个独占式锁的获取锁与解锁过程,但其实在AQS里面,对于独占式锁是可以设置超时获取锁的,也就是一旦在队列中等待了指定时间后都没有拿到锁,就放弃去获取锁独占式超时获取同步状态对应的方法为tryAcquireNanos,尝试获取有超时时间的锁,注意:Nanos代表的是纳秒参数里面有一个arg,这个参数是传给tryAcquire与doAcquireN.

2021-06-19 12:04:27 462

原创 Java并发(十):独占式、共享式的获取与释放

Lock接口队列同步器AbstractOwnableSynchronizer实现分析同步队列底层结点状态结点插入保证线程安全独占式同步状态的获取与释放共享式同步状态获取与释放共享式同步tryAcquireShareddoAcquireSharedsetHeadAndPropagatedoReleaseShared共享式释放tryReleaseShared前面我们认识了ReentrantLock(可重入锁)可Java里面不止一种锁,所以下面来了解一下Java里面有什么锁Lock接口在Lock接口出现.

2021-06-18 16:39:35 958

原创 Java并发(九):延迟初始化的两种解决方案、认识类初始化过程中的同步机制

volatile解决重排序问题类初始化解决重排序问题类初始化过程中的同步机制第一阶段第二阶段第三阶段第四阶段第五阶段volatile与类初始化的两个方案之间存在什么区别下面我们来谈一下双重检查锁定与延迟初始化volatile解决重排序问题在前面学习懒汉模式实现单例模式的时候,我们已经使用过下面的这一套优化流程了代码块中加锁判断单例对象是否已经初始化如果已经初始化,直接返回单例对象再进行判断多一次单例对象是否已经初始化,来判断单例模式对象是否已经初始化,因为可能同时有多个线程判断出单例对.

2021-06-17 17:38:02 941 1

原创 Java并发(八):final域的内存语义

final域的重排序规则写final域的重排序规则读final域的重排序规则final域的引用类型为什么final引用不能从构造函数内溢出?即发生重排序final的底层实现final这个修饰可以加在类、方法、变量上加在类上面是让类不可以被继承,而且里面的方法全部默认为final修饰加在方法上是让该方法不可以被子类重写加在变量上,表示该变量变为常量,而且必须进行初始化但其实final也是可以解决一些并发重排序问题的。final域的重排序规则final域也有自己的重排序规则在构造函数来对.

2021-06-17 16:18:04 281

原创 # Java并发(七):锁的内存语义

锁的释放和获取的内存语义锁的释放锁的获取与volatile的读写内存语义比较锁内存语义的实现在Java里面,锁除了让临界区互斥外,还可以让释放锁的线程向获取同一个锁的线程发送消息锁的释放和获取的内存语义接下来,看一下线程在锁的释放和获取究竟对内存是怎样的操作锁的释放当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中锁的获取当线程获取锁时,JMM会把该线程对应的本地内存置为无效,从而使得被监视器monitor保护的临界区代码必须从主内存中读取共享变量(前面已经提到过,s.

2021-06-17 13:38:02 157

原创 Java并发(六):ReentrantLock的解锁过程

unlock方法release方法tryRelease方法unparkSuccessor方法前面我们已经了解过了加锁过程,下面就来看看解锁的过程是怎样的这里提一下,公平锁和非公平锁的解锁过程是一样的unlock方法解锁调用的就是unlock方法可以看到其调用的还是内部类sync的方法,而且可以看到这是一个无返回值的方法并且传入了一个为1的参数release方法可以看到,其调用的是AQS里面的release方法步骤如下先调用tryRelease方法,尝试进行解锁然后判断是否需要.

2021-06-17 10:31:35 418

原创 Java并发(五):ReentrantLock的加锁实现——公平锁

ReentrantLockAQS的底层AQS的变量、常量与内部类Node内部类FairSync:公平锁lock方法AbstractQueuedSynchronizer的acquire方法tryAcquire方法getState方法hasQueuedPredecessors方法setExclusiveOwnerThread方法总结tryAcquire方法返回AbstractQueuedSynchronized的acquire方法acquireQueued方法setHeadshouldParkAfterFai.

2021-06-16 22:47:44 1973

原创 Java并发(四):volatile的内存语义

volatile可见性实验volatile的特性volatile 写与读的内存语义写语义读语义总结一下读写语义volatile的实现volatile的内存语义实现前面我们已经讲过了volatile的作用、底层实现与内存屏障下面就总结一下整个流程volatile可见性实验举个栗子我这里开了两个线程,后面的线程去修改volatile变量,前面的线程不断获取volatile变量,结果是会一致卡在死循环,控制台没有任何输出假如将flag让volatile来进行修饰结果是:三秒后,就不会不断打印.

2021-06-14 18:25:21 1794 2

原创 Java并发(三):重排序与内存一致性

happens-before重排序数据依赖性as-if-serial语义重排序对多线程的影响顺序一致性同步程序不同步程序上面一篇已经讲了一下指令重排序与内存屏障究竟是怎么回事下面就来研究一下重排序与内存一致性happens-beforehappens-before是一种关系,在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系,注意,这里的两个操作既可以是不同线程,也可以是同一个线程那happens-before有什么规则了程序.

2021-06-14 12:34:26 549

空空如也

空空如也

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

TA关注的人

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