自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数组查询块的原因

综上所述,实际上在数组中查找元素是可以通过数学表达式计算被查找元素的内存地址的,通过内存地址可以直接定位该元素。第三:通常首元素的内存地址作为整个数组对象的内存地址,可见我们是知道首元素内存地址的。第四:再加上数组中的元素是有下标的,有下标就可以计算出被查找的元素和首元素的偏移量。第一:Java的数组中存储的每个元素类型一致,也就是说每个元素占用的空间大小相同。第二:Java的数组中存储的每个元素在空间存储上,内存地址是连续状态的。

2022-11-08 09:57:37 248 1

原创 spring-session+redis解决共享session问题

具体的实现方式是:实现了一个过滤器filter,在所有访问请求进入servlet前将其拦截,在filter中,对request对象和response对象做了一层包装,然后放行,执行后面的逻辑,后面如果要用session对象时,调用getsession()方法,其实调用的就是包装后的request对象的getsession()方法,这个方法中,就是从redis里获取session了,所有的服务器都从redis中获取同一个session,那么共享session就实现了;(30是默认有效时间,可以设置的)

2022-11-07 09:32:09 1431

原创 你真的懂mysql中order by吗

在写sql语句查询的时候,很多情况都需要将目标数据按照某个字段进行排序再返回,在sql中通常就用order by来完成排序,那么,mysql内部是如何完成排序的呢,除了order by 之外,还有更好的排序方式吗?一、order by实现方式首先,要知道mysql会为每个线程分配一部分内存空间用来专门做排序,名字就叫做“sort_buffer”。第一种情况:1、如果目标数据单条记录数据量不大的情况下,mysql会将每行的数据全字段的放到‘sort_buffer’中,如果“sort_buf..

2022-04-27 09:53:50 1267

原创 关于lambda表达式的两点使用

一、lambda表达式访问变量lamda表达式里可以访问成员变量和局部变量,但是访问局部变量时默认变成final修饰,即不可改变,否则,编译不过去;成员变量可以修改。public class LambdaTest { private static int j; private int k; public static void main(String[] args) { LambdaTest t = new LambdaTest(); ...

2022-03-28 19:03:16 409

原创 cglib动态代理实现及其原理浅析

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。举例:1、定义被代理类:public class CglibOrigin {​ public CglibOrigin(){ System.out.println("CglibOrigin对象创建"); }...

2022-03-22 18:21:30 2596

原创 通过spring容器中的代理对象获取目标对象

一般情况下,在springboot项目中被IOC容器管理的类在创建对象时,会经过aop的后置处理器(BeanPostProcessor)生成代理对象供我们使用,那如果想要获取目标对象怎么做呢,通常用到AopUtils工具类```public Object test(Object proxy) throws Exception { //判断是否是代理对象 if(AopUtils.isAopProxy(proxy)){ //cglib 代理 ...

2022-03-18 19:02:30 3291

原创 泛型的相关

一、泛型类型只能是引用类型,不能是基本类型(如int之类的)二、泛型只在编译阶段有效在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。三、泛型不能继承例如:public void test(Example<Nu

2022-03-16 19:13:02 306

原创 @EnableConfigurationProperties注解

@EnableConfigurationProperties注解是将加了@ConfigurationProperties注解的类加入到IOC容器中,只有加到IOC容器中,@ConfigurationProperties注解才会生效,为被注解的类的属性赋值,并且必须是有@EnableConfigurationProperties注解将类加到Ioc容器才可以,用@import等注解,@ConfigurationProperties会报错...

2022-03-09 11:06:55 197

原创 @EnableAspectJAutoProxy的exposeProxy属性和proxyTargetClass属性

把@EnableAspectJAutoProxy的exposeProxy设为true,是暴露代理对象的意思,也就是可以通过设置这个属性,用AopContext.currentProxy()的方式获取到当前的代理对象,可以解决同一类中两个方法相互调用是aop不生效的问题@Componentpublic class MessageService { public String showMessage(String info) { System.out.println(".

2021-12-15 19:03:13 1533

原创 bio与nio的几种实现方式

在socket 通讯层面,BIO就是阻塞io,也就是说,在socket等待连接事件或者读写事件的发生的过程中,当前线程会一直处于阻塞状态,不能做其他事情;1、biopublic static void main(String[] args) throws IOException { //bio阻塞io,主线程只能处理一个连接,当前连接没有处理完,是不能接收新链接的,这对于并发来讲,是非常不友好的 ServerSocket serverSocket = new ServerSocket(9.

2021-12-07 09:39:08 536

原创 @Bean注解下的方法如何执行

通过@Bean修饰的方法来注入对象的流程:首先,@bean修饰的方法的方法名称会加入到DefaultListableBeanFactory.beanDefinitionNames集合中,随后会经过refresh一并初始化,以下图为例:启动类运行时,由于spring默认是非懒加载的,因此会遍历beanDefinitionNames,并做一系列判断进行初始化,而myBean也在此列。初始化myBean的时候,走到这里时,进去:经过圈红处对mbd的判断,表示这个对象应...

2021-12-01 18:17:34 1719

原创 SmartInitializingSingleton接口

SmartInitializingSingleton接口,实现SmartInitializingSingleton的接口后,当所有单例 bean 都初始化完成以后, Spring的IOC容器会回调该接口的 afterSingletonsInstantiated()方法。主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情,原理就是在启动类启动后,经过refresh,来在容器中初始化所有的非懒加载的单例对象,通过遍历beandefinitionnames,去获取或者初始化对应的对象

2021-11-29 17:07:50 1343

原创 xxl-job的实现原理(源码分析)

关于使用xxl-job的流程,这里不再赘述。在加入xxl-job依赖后,需要我们自己做的就是创建一个XxlJobSpringExecutor对象交给spring容器管理,因为XxlJobSpringExecutor实现了SmartInitializingSingleton接口,在spring管理的对象完成初始化之后,会执行SmartInitializingSingleton接口的afterSingletonsInstantiated()方法,XxlJobSpringExecutor重写了此方法;1、

2021-11-26 17:32:27 3638

原创 mybatis-plugin的实现原理(源码分析)

mybatis的plugin插件就是拦截器,可以对ParameterHandler、ResultSetHandler、StatementHandler、Executor共4个接口对象内的方法进行拦截,因此,自定义插件,必须要实现org.apache.ibatis.plugin.Interceptor接口。重写方法interceptor()package org.apache.ibatis.plugin;import java.util.Properties;public interface I

2021-11-22 18:47:58 298

原创 对象转json后,对象和json的内容不一致

用fastjson将对象转json后,出现这种情况:{"object":{"id":"-1","type":102,"url":"https://xxxxxxx"},"paramObject":{"$ref":"$.materialList[0].object"}}sourceMaterialVO的内容居然是"$ref":"$.materialList[0].object",原因是在这个对象中出现了循环引用的情况,就是说sourceMaterialVO的对象内容就是object对象内容,一旦出现了这种一

2021-11-22 17:58:20 1147

原创 线程池核心参数设置策略

很多时候,我们为了提高程序响应速度,会将耗时较长的代码交给线程池去异步执行,Java通过Executors提供四种线程池,分别newSingleThreadExecutornewFixedThreadPool 、newScheduledThreadPool 和newCachedThreadPool ,但这四种并不推荐使用,因此需要自己去自定义线程池,那么,问题就来了,自定义的话,线程池的核心参数如何设置呢?​ 首先,要明白核心参数有哪些:​ 1、co...

2021-11-05 10:20:46 898

原创 maven依赖导致的jar包冲突解决方式

maven依赖导致的jar包冲突解决方式:mvc和context都依赖与sprng-core一个,依赖的是5.0.8版本,一个依赖的是4.2.4版本,那么真正加载的是5.0.8版本,如何换成4.2.4版本呢,有三种方式:1、依据声明优先原则调换依赖在pom文件中的顺序,如2、就近优先原则将sprng-core依赖直接引入pom文件中,因为直接依赖的优先级高于传递依赖,因此,会使用4.2.4版本3、排除依赖我们可以直接排除spring-context中的spri..

2021-10-09 13:52:01 165

原创 ReentrantLock加锁及解锁过程之源码分析

一、ReentrantLock锁lock() 流程首先不论公平锁还是非公平锁,都会调用下面的公平锁和非公平锁(在没有指定的情况下,默认是非公平)有不同的tryAcquire方法实现,公平锁是在tryAcquire方法中先对锁状态做判断,是否为0,为0则表示当前没有线程持有锁,可获取,这里,公平锁会进行hasQueuedPredecessors,判断在阻塞队列里是否有线程,并且判断是不是当前线程,若有且并不是当前线程直接返回false;如果锁状态不为0的情况下,判断当前线程是不是exclus.

2021-07-23 08:57:17 202 1

原创 synchronized关键字底层原理解析

一、前言 大家想必都知道,当我们再并发场景下要想使用或者操作一个全局的共享变量时,可能会出现数据不安全的情况,这也就是我们通常所说的线程安全问题,为了保证数据的安全性可靠性,我们就需要对线程进行同步,这也就是synchronized关键字出现的背景了。二、用法 synchronized可以修饰普通方法、静态方法,同时还可以直接定义代码块,但是归根结底它上锁的资源只有两类:一个是对象,一个是类。 修饰普通方法时,synchronized的锁对象是当前类...

2021-06-27 10:07:36 258

原创 深入理解volatile可见性原理与MESI缓存一致性协议

volatile作用——可见性 大家都应该知道 volatile 的主要作用有两点: 1、保证变量的内存可见性 ;2、禁止指令重排序,今天我们重点来谈谈可见性。 首先,在理解 volatile 可见性前,先来看一看一个多线程访问共享变量的例子。public class VolatileExample { /** * main 方法作为一个主线程 */ public static void main(String[] args) ...

2021-06-17 09:25:07 413

原创 MVCC(多版本并发控制)原理

一、概念 MVCC(Multi-Version Concurrency Control)实在mysql的innodb引擎中yong'lai

2021-06-13 15:25:49 4166

原创 Idea热部署实现(JRebel插件的安装使用)

如今idea的使用越来越广泛,也越来越受到开发人员们的喜爱,因为idea确实也是很好用,不过有一点不足之处就是它本身没有集成热部署工具,一开始改动代码之后,都需要重新去启动服务,浪费时间,体验也打折扣,今天,就和朋友们分享一个热部署工具,JRebel,亲测好用!一、安装 1、在IDEA中一次点击 File->Settings->Plugins->Brows Repositories 2、在搜索框中输入JRebel进行搜索 ...

2021-06-11 08:21:19 111

原创 windows环境通过指定端口找出并杀掉对应进程

相信朋友们遇到过这种情况,当程序非正常终止后,重新启动后,发现端口号被占用,于是要将占用端口的进程杀掉,但是通过任务管理器去杀进程很可能会范围攻击导致“错杀无辜”,下面的这个方法就完美的解决了这个问题,真正做到了精准打击,不留活口。 话不多说,言归正传。其实很简单,两个命令足矣: 第一个:netstat -ano | findstr 端口号 //找到被占用的端口号所在进程 第二个:taskkill /f /pid 进程ID ...

2021-06-08 09:29:42 234

原创 解决idea中terminal命令窗口不生效问题

今天用idea启动vue前台项目,下载安装好node.js并且配置好npm环境变量后,在terminal终端进行npm install,发现报错了,说‘npm’不是内部或外部命令,可是cmd窗口却没问题,说明并不是环境变量配置的问题,于是,一顿Google之后,发现了问题所在:原来是idea中terminal的shell path 指定的cmd位置和本地cmd位置不一致,接下来就是一番操作:问题顺利解决了!...

2021-06-04 15:41:56 5772 3

原创 myBatis执行流程及源码分析

一、简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。那接下来,就来看一下MyBatis到底是如何执行的。二、执行流程 1、获取sqlsessio...

2021-06-04 08:09:18 1212 3

空空如也

空空如也

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

TA关注的人

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