自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 16、Spring~配置类

Spring容器在启动过程中,在BeanFactory创建之后,会执行BeanFactoryPostProcessors,这里会拿到之前Spring容器自己设置的ConfigurationClassPostProcessor,Spring容器详细的启动过程请移步至《doProcessConfigurationClass()方法详解。processConfigurationClass()方法详解。parse()方法,有几个重载方法,不同参数处理逻辑都是调用。通过上述代码,可以看到,这里会调用。

2024-06-26 21:22:32 894

原创 15、Spring~容器启动过程

15、Spring~容器启动过程容器启动过程AnnotationConfigApplicationContext类的四个构造器:启动过程详解无参构造方法refresh()方法prepareRefresh()方法prepareBeanFactory()方法invokeBeanFactoryPostProcessors()方法registerBeanPostProcessors()方法finishBeanFactoryInitialization()方法GenericApplicationContext对象详解

2024-06-26 21:21:50 1105 1

原创 14、Spring之Bean生命周期~推断构造方法

这里我们可以看到,最终会调用ConstructorResolver类的instantiateUsingFactoryMethod()方法,我们详细分析一下ConstructorResolver类的instantiateUsingFactoryMethod()方法。通过上述代码,我们可以看到,这里会调用ConstructorResolver类的autowireConstructor()方法,接下来,我们详细分析ConstructorResolver类的autowireConstructor()方法。

2024-06-21 14:05:33 1018

原创 15、Spring之Bean生命周期~总结

扫描这一步扫描将带@Component注解的类扫描成BeanDefinition相关博客《Spring之Bean生命周期~扫描合并BeanDefinition类直接存在继承关系,扫描到的BeanDefinition也需要进行继承;相关博客《Spring之Bean生命周期~合并BeanDefinition获取Bean这一步为什么是获取Bean不是创建Bean,Spring容器中大多数Bean对象都是单例的,有单例池的存在,单例池中没有Bean才会去创建Bean;实例化前实例化。

2024-06-21 14:05:09 286

原创 13、Spring之Bean生命周期~循环依赖

AutowiredBeanOne Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。

2024-06-18 11:34:23 646

原创 12、Spring之Bean生命周期~依赖注入(3)

通过上述代码,我们可以看到,不管是属性还是方法都会调用getResourceToInject()方法查找属性的值,我们这里可以看到,InjectedElement类是一个抽象类,看他的子类会发现,ResourceElement继承啦InjectedElement类,或者在查找注入点时,最后我们可以看到属性或者方法参数被封装成ResourceElement对象放入啦缓存。这里还有一个有意思的判断,判断啦方法参数必须是一个,不能没有参数,也不能有一个以上的参数,否则会报错;getResource()方法详解。

2024-06-18 11:33:34 615

原创 11、Spring之Bean生命周期~依赖注入(2)

11、Spring之Bean生命周期~依赖注入(2)依赖注入查找注入点对注入点进行赋值InjectionMetadata.inject()方法AutowiredFieldElement.inject()方法resolveFieldValue()方法resolveDependency方法createOptionalDependency()方法doResolveDependency()方法determineAutowireCandidate()方法resolveMultipleBeans()方法findAuto

2024-06-17 09:11:23 1391 3

原创 10、Spring之Bean生命周期~依赖注入(1)

这里并没有校验属性是不是被static修饰的,因为@Bean(autowire = Autowire.BY_NAME)已经是不推荐的方式,这里没有深入研究,欢迎知道的大佬留言!@Bean(autowire = Autowire.BY_NAME)方式的依赖注入,如果想了解其他方式的依赖注入请移步至《registerDependentBean()方法详解。autowireByName()方法详解。autowireByType()方法详解。

2024-06-17 09:10:57 745

原创 9、Spring之Bean生命周期~依赖注入(总)

通过XML中定义Bean时,可手动注入。从类型角度区分,分两种:手动和自动。

2024-06-16 16:04:55 691

原创 8、Spring之Bean生命周期~销毁

spring容器在正常关闭的时候会销毁Bean对象,比如上述代码中,执行close方法时,容器关闭,销毁单例的Bean对象;通过上述代码我们可以看到,如果给BeanDefinition设置指定的销毁方法或者把销毁方法设置成(inferred),spring在销毁bean的时候会去找bean中的close方法和shutdown方法;inferDestroyMethodIfNecessary()方法详解。requiresDestruction()方法详解。hasDestroyMethod()方法详解。

2024-06-16 11:53:23 310

原创 7、Spring之Bean生命周期~初始化

这里可以看到,首先会判断当前Bean对象是否实现了InitializingBean接口,如果实现了就调用它的afterPropertiesSet()方法,然后判断BeanDefinition中是否指定初始化方法,如果指定啦初始化方法且不是afterPropertiesSet()方法的话,会调用BeanDefinition指定的初始化方法;applyBeanPostProcessorsBeforeInitialization()方法详解。invokeAwareMethods()方法详解。

2024-06-10 17:18:45 852

原创 6、Spring之Bean生命周期~创建Bean(2)

【代码】6、Spring之Bean生命周期~创建Bean(2)

2024-06-10 17:18:17 741

原创 5、Spring之Bean生命周期~创建Bean(1)

Spring Bean的生命周期首先会经过扫描,然后回经过合并,合并之后就会通过getBean()方法去获取bean,getBean()方法大致逻辑,先根据判断是单例bean还是原型bean,原型bean直接创建,单例bean会判断单例池中有没有,没有的话调用createBean()方法。如果实例化前这一步有返回值,会直接返回,不走后续的实例化、依赖注入、初始化前,直接跳到初始化这一步,执行AOP操作;resolveBeforeInstantiation()方法详解。通过上述代码,我们就可以看到。

2024-06-09 16:46:34 680

原创 4、Spring之Bean生命周期~获取Bean

Spring Bean的生命周期首先会经过扫描,然后回经过合并,合并之后就会通过getBean()方法去获取bean,getBean()方法大致逻辑,先根据判断是单例bean还是原型bean,原型bean直接创建,单例bean会判断单例池中有没有,没有的话再去创建。通过canonicalName()方法我们可以看到,会不断地从aliasMap中回去,直到获取到的是null,说明是真正的BeanName;这里我们可以看到如果BeanName是以&开头的话,会截取掉开头所有的&;此方法涉及到解决循环依赖。

2024-06-09 16:45:21 1074

原创 3、Spring之Bean生命周期~合并BeanDefinition

spring通过扫描,将class文件封装成BeanDefinition之后,并不能直接拿BeanDefinition去创建Bean对象,中间还需要经过一系列的合并和判断,废话不多说,直接上代码;通过上述代码我们可以看到首先回去mergedBeanDefinitions缓存中判断,这个BeanDefinitions是否已经合并过,如果合并过直接拿缓存中的对象,缓存中没有的话,调用。合并beanDefinition和java中的类继承一样,子类有的用子类,子类没有的用父类;

2024-06-07 14:20:43 366

原创 2、Spring之Bean生命周期~扫描

不管那种方式都需要指定spring容器的扫描路径,xml文件通过 <context:component-scan /> 标签设置扫描路径,配置类通过 @ComponentScan 注解设置扫描路径,spring容器在拿到扫描路径之后就会对配置的路径进行挨个扫描,如果符合bean的要求,就会把他封装成一个BeanDefinition。这是只是大致过一个spring容器的创建,具体详细的创建步骤并不会展开细说,只说和bean生命周期有关的部分;findCandidateComponents方法详解。

2024-06-07 14:20:24 1126

原创 3、Tomcat类加载机制

Spring 作为共享的第三方 JAR 包,它本身是由 SharedClassLoader 来加载的,Spring 又要去加载业务类,按照前面那条规则,加载 Spring 的类加载器也会用来加载业务类,但是业务类在 Web 应用目录下,不在 SharedClassLoader 的加载路径下,这该怎么办呢?这种类加载机制其实就是双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再 委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。

2024-06-04 19:50:52 869

原创 1、Spring之底层架构核心概念

bean一定是一个对象。在Spring的源码实现中,当我们new一个ApplicationContext时,其底层会new一个BeanFactory出来,当使用ApplicationContext的某些方法时,比如getBean(),底层调用的是BeanFactory的getBean()方法。为什么要使用ASM技术,Spring启动的时候需要去扫描,如果指定的包路径比较宽泛,那么扫描的类是非常多的,那如果在Spring启动时就把这些类全部加载进JVM了,这样不太好,所以使用了ASM技术。

2024-06-04 19:50:25 1158

原创 2、Tomcat 线程模型详解

那么,子 reactor 会监听客户端连接上的后续事件,有读写事件发生时,它会让在同一个线程中的 handler 读取请求和返回结果,而和单 reactor 多线程类似,具体业务处理,它还是会让线程池中的 worker 线程处理。你会看到 Tomcat 中的各种连接器,展开“http-nio-8080”,你会看到这个连接器上的统计信息,其中 maxTime 表示最长的响应时间,processingTime 表示平均响应时间,requestCount 表示吞吐量,errorCount 就是错误数。

2024-06-03 15:30:03 1167

原创 1、Tomcat整体架构

官方文档Tomcat是Apache Software Foundation(Apache软件基金会)开发的一款开源的Java Servlet容器。它是一种Web服务器,用于在服务器端运行Java Servlet和JavaServer Pages (JSP)技术。它可以为Java Web应用程序提供运行环境,并通过HTTP协议处理客户端请求。Tomcat也支持多种Web应用程序开发技术,例如JavaServer Faces (JSF)、Java Persistence API (JPA)等。总的来说,

2024-06-03 15:29:38 1540

原创 7、Innodb底层原理

我们知道由于MySQL是开源的,他有非常多种类的客户端:navicat,mysql front,jdbc,SQLyog等非常丰富的客户端,包括各种编程语言实现的客户端连接程序,这些客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是有连接器完成的。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。开始执行的时候,要先判断一下我们所登录的用户对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如果有权限,就打开表继续执行。

2024-05-31 15:03:37 595

原创 6、MySQL之MVCC

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。

2024-05-31 15:03:06 892

原创 5、Mysql事务隔离级别与锁机制

我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。锁是计算机协调多个进程或线程并发访问某一资源的机制。

2024-05-25 19:22:43 967

原创 4、SQL性能调优

小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。转化为日期范围查询,有可能会走索引(MySQL版本8.0):可以将大的范围拆分成多个小范围。mysql5.7中测试结果。mysql5.7中测试结果。mysql5.7中测试结果。mysql8中测试结果。mysql8中测试结果。mysql8中测试结果。

2024-05-24 15:25:37 723 1

原创 3、SQL分析工具~Explain

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析SQL查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中准备数据环境示例表:执行测试sql-- 在查询中的每个表会输出一行,如果有多个表通过 join 连接查询,那么会输多两行。

2024-05-23 20:16:17 903 1

原创 2、MySQL索引

从数据结构角度可分为B+树索引、哈希索引、以及FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)和R-Tree索引(用于对GIS数据类型创建SPATIAL索引);从物理存储角度可分为聚集索引、非聚集索引;从逻辑角度可分为主键索引、普通索引,或者单列索引、多列索引、唯一索引、非唯一 索引等等。

2024-05-22 22:33:53 825 1

原创 1、MySQL架构

然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。全部使用长连接后,有时候 MySQL 占用内存涨得特别快,因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候才释放,所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM)。但如果赊账的人多了,粉板总会有记不下的时候,这个时候掌柜一定还有一个专门记录赊账的账本。

2024-05-22 15:07:26 841

原创 8、JVM~Class常量池与运行时常量池

s0还是常量池 中"zhuge”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”str”的引用,s2因为有后半部分 new String(”tr”)所以也无法在编译期确定,所以也是一个新创建对象”str”的引用;在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。:JVM对于字符串引用,由于在字符串的"+“连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a” + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。

2024-05-20 10:36:39 1074

原创 7、JVM~调优工具

执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法。启动一个java程序(可以学习rocketmq的调优策略),通过Jmap可以查看内存信息,实例个数以及占用内存大小;使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如19663。找到内存和cpu占用最高的线程tid,比如19664。可以在内存溢出时导出堆内存的快照信息。按H,获取每个线程的内存情况。

2024-05-20 09:47:31 523

原创 6、JVM~垃圾收集器

XX:G1HeapWastePercent gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。针对并发标记(还有并发清理)开始后产生的新对象,通常的做法是直接全部当成黑色,本轮不会进行清除。

2024-05-17 09:33:49 896

原创 5、JVM~分代收集理论和垃圾回收算法

垃圾回收前如果对象实现啦finalLize方法,会回调用finalize方法进行一次拯救,而且只会执行一次,因为finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间如果比较长,可能出现耗尽资源之前,gc却仍未触发。根据老年代的特点推出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。软引用在实际中有重要的应用,例如浏览器的后退按钮。

2024-05-16 10:51:53 646

原创 4、JVM~对象创建过程

大量对象被分配在eden区,eden区满了后会触发minor gc,可能会有90%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让eden区尽量的大,survivor区够用即可,为了减少临时对象在堆内分配的数量,JVM通过。

2024-05-16 09:56:41 831

原创 3、JVM~内存模型

本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。3. To Survivor区满啦之后进行一次垃圾回收,将存活下来的对象放入From Survivor区,依次往复大约15次后,存活的对象会进入老年代;:方法A调用方法B时,方法B的栈帧会存储方法A调用方法B的行号,方法B执行完成,方法A从对应行号继续放下执行;堆是一块线程共享的内存区域,也是垃圾收集行为最频繁的内存区域,堆区分为。

2024-05-15 14:13:20 835

原创 2、JVM~类加载

负责加载用户自定义路径下的类包;

2024-05-13 14:24:04 536

原创 1、JVM~虚拟机

首先,我们代码是写在java文件中,通过javac命令可以将java文件编译成class文件,class文件的本质就是二进制文件。JVM不会管class是怎么生成的,只要遵循JVM规范,手写的class文件也可以被JVM加载并运行。Java发展至今,已经远不是一种语言,而是一个标准。通过JVM虚拟机,屏蔽了上层各种开发语言的差距,同时也屏蔽了下层各种操作系统的区别。HotSpot是JVM虚拟机的一种实现,简单理解,JVM是一个接口,HotSpot是JVM接口的实现类,JVM同样可以有多个实现类。

2024-05-08 22:20:33 289

原创 swagger注解

1. @Api用于类;表示标识这个类是swagger的资源tags–表示说明value–也是说明,可以使用tags替代Controller1 @Api(value = "demo1测试",tags = "测试Controller1") @RestController @RequestMapping("demo/one/controller") public class DemoOn...

2020-04-12 19:28:11 483

原创 SpringBoot整合Swagger2

SpringBoot整合Swagger2项目搭建简介Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。作用:1. 接口的文档在线自动生成。2. 功能测试。项目搭建maven依赖`<!--s...

2020-04-12 15:05:38 76

原创 idea搭建struts2框架dome

第一步第二步第三步进入项目目录后,在web/WEB-INF下新建lib文件夹,同时将在上一节整理的struts2开发包拷入lib文件,之后,右键lib目录,选择Add as library选项,将开发包配置好。如下:jar包下载连接:https://pan.baidu.com/s/1w6NZRVr6LIMpQusVvpw64w提取码:5034第四步打开web/WEB-INF中的...

2020-02-14 11:19:07 257

空空如也

空空如也

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

TA关注的人

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