自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 后端保证幂等性

【代码】后端保证幂等性。

2024-11-13 10:08:34 162 1

原创 非标准starter的bean注入方式

我们都知道一个标准的starter的自动扫描是怎样的,但最近发现,如果不是一个标准的starter,也就是说没有spring.factories文件,这个时候需要我们显式的在启动类的@ComponentScan中的basepackges属性写上,我们要扫描的包名(他扫描的不仅仅本项目,还有依赖的那些项目的)。同时依赖的项目里面可能也有@ComponentScan注解,也会被扫描进去,也就是说,具有传递功能,不知道这个说法对不对。

2024-11-13 09:53:52 232

原创 小白也能听懂的springboot自动装配原理

第一种情况,就是我们自己写代码的项目中需要自动装配,这个时候我们要把自己认为需要用到的bean都给注入其中,比如普通bean可以定义一个@configuration的类文件,@bean用于方法上,那如果是controller,就用@Controller,服务层,就用@Service,Dao层用@Repository,如果只是个普通的组件,直接@Component,其实这些注解本质上区别不大,都是把对象注入到容器中,只是语义的区别,我们更清晰明了当前类的作用。

2024-04-29 17:02:21 179 3

原创 某个类A方法调用B方法,aop不生效的原因

首先请思考一下以下代码执行的结果:LogAop.java//声明一个AOP拦截service包下的所有方法@Aspectpublic class LogAop { @Around("execution(* com.demo.service.*.*(..))") public Object log(ProceedingJoinPoint joinPoint) throws Throwable { try { MethodSignature metho.

2020-12-18 16:25:21 1458

原创 亲缘指数的计算

总体计算公式是:找到最近的共同的祖先,计算出两个人距离祖先的代数之和,然后计算1/2的代数之和次幂,再乘以共同祖先数量1,假设我和我表弟,首先找到我们共同的祖先,也就是我们的外公外婆,一共是2代,加起来是4代,然后一代是1/2,所以(1/2)的4次方是1/16,然而我们有两个祖先,外公外婆,所以乘以2也就是1/82,和自己的父母,是1/2,因为共同的祖先就是父母,一共是一代,也就是1/23,如果是同父同母的关系,那么一共的代数是2(1+1),然后1/2的2次方是1/4,由于我们有两个共同的祖先,

2020-12-10 14:37:45 4836 1

原创 seata的一些理解

有三个组成部分:1,TC:事务协调器,是个独立的中间件,需要部署运行,维护着全局事务的运行状态,接收TM发起的全局事务的提交和回滚,负责和RM通信协调各个分支事务的提交和回滚2,TM:事务管理器,负责开启一个全局事务3,RM:控制分支事务,负责分支注册,并接收事务协调器TC的指令,拿新用户注册送积分来举例,有两个微服务,一个用户服务,一个积分服务具体的执行流程如下:1,用户服务的TM像TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID,2,用户服务RM向TC注册

2020-08-27 14:26:39 292

原创 volatile关键字

volatile关键字主要有三方面作用:1,实现long/double类型变量的原子操作2,防止指令重排序3,实现变量的可见性当使用volatile修饰变量时,应用就不会从寄存器中获取该变量的值,而是从内存(高速缓存)中获取它和锁类似的地方有两点:1,防止指令重排序2,实现变量的可见性对于volatile关键字变量的读写操作,本质上都是通过内存屏障来执行的,内存屏障兼具了两方面能力:1,防止指令重排序2,实现变量的可见性1,对于读取操作来说,volatile可以确

2020-08-22 15:14:09 154

原创 传统springmvc的容器初始化过程以及现代springboot容器初始化过程的一些差异和总结

传统的springmvc容器的初始化过程:1,通过SpringServletContainerInitializer来负责对容器启动时的相关组件的初始化,在web这个jar包下面有个meta-inf目录,下面有个services目录,下面有个javax.servlet.ServletContainerInitializer文件,里面指明了SpringServletContainerInitializer2,到底要初始化哪些组件是通过Servlet规范中所提供的注解handlesTypes来.

2020-08-15 09:22:30 625

原创 关于CyclicBarrier的底层执行流程

1,初始化CyclicBarrier中的各种成员变量,包括parties,count以及runnable(可选)2,当调用await方法时,底层会检查计数器是否已经归零,如果是的话,那么久首先执行可选的runnable,接下来开始下一个generation;3,在下一个分代中,将会重置count为parties,并且创建新的generation实例4,同时在调用Condition的signalAll方法,唤醒所有在屏障前等待的线程,让其开始继续执行5.如果计数器没有归零,那么当前的调用线程将

2020-08-14 13:18:10 173

原创 JDK1.5之前和之后实现方法同步的方式

在jdk1.5之前,我们想要实现线程同步,只能通过synchronized关键字这一种方式来达成,底层,JAVA也是通过synchronized关键字来做到数据的原子性的,synchronized关键字是jvm实现的一种内置锁,从底层角度来说,这种锁得获取和释放是由jvm帮助我们隐式实现的从jdk1.5开始,并发包引入了lock锁,lock同步锁是基于JAVA来实现的,因此锁的获取和释放都是通过JAVA代码来实现和控制的,然而synchronized是基于底层操作系统Mutex lock来实现的,每次对锁

2020-08-04 21:43:22 349

原创 jvm实现同步与自旋

jvm中的同步是基于进入与退出监视对象(管程对象,Monitor)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象会和JAVA对象一同创建并销毁,Monitor对象是由c++来实现的当多个线程同时访问一段同步代码时,这些线程会被放到一个EntryList集合中,处于阻塞状态的线程都会被放到该列表中,接下来,当线程获取到对象的Monitor时,Monitor是依赖于底层操作系统的mutex lock来实现互斥的。线程获取mutex成功,就会持有该mutex,这时其他线程无法再获取如果

2020-08-03 21:51:03 270

原创 wait,notify,notifyall方法的总结

wait方法:在调用该方法时候,线程必须持有调用对象的锁,当调用后,线程就会释放该对象的锁,在调用thread的sleep方法的时候。线程是不会释放对象的锁的。关于wait,notify和notifyall方法的总结:1,当调用wait时,首先需要确保调用了wait方法的线程已经持有了对象的锁2,当调用wait后。该线程就会释放掉对象的锁,然后进入等待状态(waitset)3,当线程调用了wait后进入到等待状态时,它就可以等待其他线程调用相同对象的notify或者notifyall方法来使得自己被

2020-08-03 21:23:07 226

原创 springmvc的HandlerInterceptorAdapter

preHandle:会在请求到达控制器前被调用。 postHandle:在方法执行后调用,(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。...

2020-05-28 14:34:12 244

原创 CommandLineRunner和ApplicationRunner接口

业务场景:应用服务启动时,加载一些数据和执行一些应用的初始化动作。如:删除临时文件,清除缓存信息,读取配置文件信息,数据库连接等。1、SpringBoot提供了CommandLineRunner和ApplicationRunner接口。当接口有多个实现类时,提供了@order注解实现自定义执行顺序,也可以实现Ordered接口来自定义顺序。注意:数字越小,优先级越高,也就是@Order(va...

2020-05-28 09:44:04 262

原创 Filter和ZuulFilter

Filter是属于servlet提供的,位于servlet包下面,继承该接口,复写doFilter方法,可实现过滤,而ZuulFilter是zuul包下面的,继承该抽象类,复写run方法,前者比后者先执行

2020-05-28 09:43:18 1862 3

原创 springboot执行流程

SpringApplication.run(JvmStudyApplication.class, args);当我们这样执行一个run方法的时候,首先会构造一个springApplication,然后再去启动run方法构造SpringApplication的过程:1,设置webApplicationType,判断应用类型,这是springboot的一个成员变量,通过判断jar包里有...

2020-04-06 14:38:34 869

原创 指定java -jar命令来执行一个jar文件的时候的流程

我们可以通过maven build来把一个springboot项目打包成一个jar文件,然后 用java -jar jar文件名的方式启动这个项目,这个jar文件是个压缩文件,解压后有三个根目录:BOOT-INF:下面有两个子目录,分别是lib和classes,lib里面是第三方依赖的jar包,classes里面是项目里面的类信息META-INF:里面有一个清单文件MANIFEST.MF文...

2020-04-05 22:07:47 752

原创 CMS收集器

以获得最短回收时间为目标,多数应用于互联网站或者b/s系统的服务器端上基于“标记-清除”算法实现的,整个过程分为4个步骤:初始标记并发标记重新标记并发清除1,其中初始标记,重新标记这两个步骤仍然需要 STW2,初始标记只是标记一下GC Roots能直接关联到的对象,速度很快3,并发标记阶段是进行GC Roots Tracing的古城4,重新标记阶段是为了修正并...

2020-03-14 14:15:51 211

原创 JVM内存泄漏的原因

1,对象定义在错误的范围以下代码:如果Foo实例对象的生命较长,会导致临时性内存泄漏,class Foo{private String [] names;public void doIt(int length){names=new String[length]print(name)}}JVM喜欢生命周期短的对象,class Foo{public voi...

2020-03-09 15:09:29 224

原创 垃圾收集器

Serial收集器:单线程收集器,收集时会暂停所有工作线程(stop the world,简称STW),使用复制收集算法,虚拟机运行在client模式时的默认新生代收集器,最早的收集器,新生代和老年代都可以使用,在新生代采用复制算法,在老年代,采用标记整理算法,因为是单线程,没有多线程切换的额外开销。ParNew收集器:这是Serial的多线程版本,除了使用多个收集线程外,其余行为包括算法,S...

2020-03-08 20:15:20 145

原创 垃圾判断算法,GC算法,gc时机,垃圾收集器的并行和并发

堆是gc的主要工作区域,为了高效的gc,会把堆细分更多的子区域public void method1(){ Object obj=new Object();}1,生成了2部分的内存区域,1)obj这个引用变量,因为是方法内的变量,放到jvm stack里面(栈帧的局部变量表),2)真正object class的实例对象,放到heap里面2,上述的new语句一共消耗12个b...

2020-03-08 19:52:31 396

原创 栈帧和静态解析,动态分派

栈帧:栈帧是一种用于帮助虚拟机执行方法调用与方法执行的数据结构,栈帧本身是一种数据结构,封装了方法的局部变量表,动态链接信息,方法的返回地址以及操作数栈等信息符号引用,直接引用:有些符号引用是在类加载阶段或是第一次使用时就会转换为直接引用,这种转换叫静态解析,另外一些符号引用则是在每一次运行期转换为直接引用,这种转换是动态链接,这体现在java的多态性静态解析的4种解析:...

2020-02-15 20:22:16 312

原创 this关键字和异常处理方式

1,对于java类中的每一个实例方法(非static方法),其在编译后,所生成的字节码当中,方法参数的数量总是会比源代码中方法多一个(this),它位于方法的第一个参数位置处,这样,我们就可以在java的实例方法中使用this来访问当前对象的属性以及方法2,这个操作是编译期完成的,即由javac编译器在编译时候将对this的访问转化为对一个普通实例方法参数的访问,接下来运行期,由jvm在调用实...

2020-02-15 20:17:11 191

原创 字节码整体结构和数据结构

1,magic number(魔数),4个字节,值为OxCAFEBABE2,version(版本号)2+2个字节3,constant pool(常量池)2+n个字节4,Access flags访问标志信息,包括该class文件是类还是接口,是否被定义为public,是否是abstract和final,2个字节5,this className 当前类的名称,2个字节6,super...

2020-02-15 20:10:48 240

原创 字节码文件

1,使用javap -verbose命令解析一个字节码文件时候,将会分析该字节码文件的魔数,版本号,常量池,类的构造方法,类中的方法信息,类变量与成员变量等信息2,魔数:所有的.class字节码文件的前4个字节都是魔数,为固定值:OxCAFEBABE3,魔数之后的4个字节是版本信息,前两个字节表示此版本号,后两个字节表示主版本号4,常量池(constant pool):紧接着主版本号之...

2020-02-15 20:01:09 173

原创 final关键字

常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量的类的初始化执行结果:hello world注意:这里指的是将常量存放到了MyTest2的常量池中,之后MyTest2和MyParent2就没有任何关系了,甚至可以把myparent2的class文件删除。但是1)如果把final去掉,那么就是对mypar...

2020-01-14 18:11:12 174

原创 volatile关键字

volatile关键字,使一个变量在多个线程间可见,A,B线程都用一个变量,java默认是A线程中保留一份copy。这样如果b线程修改了该变量,则a未必知道使用volatile关键字,会让所有线程都会读到变量的修改值。在下面的代码中,running是存在堆内存的t对象中,当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并...

2020-01-14 18:03:52 107

原创 类的加载,链接与初始化

在java代码中,类型的加载,链接,和初始化都是在程序运行期间完成的1,加载:加载类的class文件中的二进制数据到内存中,把它放在运行时数据区的方法区中,并且在内存中创建一个java.lang.class对象,用来封装类在方法区中的数据结构加载class文件的方式: 1)从本地系统中直接加载 2)通过网络下载class文件 3)从zip,jar等...

2020-01-14 17:44:32 680

原创 设置开机自动启动,和自启动浏览器,自动全屏访问某个url

1,打开C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp2,谷歌浏览器桌面快捷方式右键属性,在目标选项卡后面加 --kiosk www.baidu.com 注:www.baidu.com是访问的url,--前面要加空格,点击确定3,把快捷方式复制到1的目录下ok了,重启电脑,就能自动进入浏览器,全屏进入指定的地址,...

2019-05-23 10:31:31 12048

原创 excel怎么查看一共有多少列

文件>>选项>>常规与保存>>勾选R1C1引用样式

2019-05-07 18:13:59 8555

空空如也

空空如也

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

TA关注的人

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