- 博客(307)
- 资源 (5)
- 问答 (2)
- 收藏
- 关注
原创 手把手一步步带您解读创建AOP代理的源码
Spring AOP 的功能基本上都是由AnnotationAwareAspectJAutoPr oxyCreator 来实现的, 那具体是怎么实现的呢,我们先来看一张AnnotationAwareAspectJAutoPr oxyCreator的层次结构图(IDEA 在windows下F4快捷键查看 )到此为止,所有bean的增强器都获取完成并且已经挑选了最合适的增强器,接下来就该创建代理,由AbstractAutoProxyCreator.createProxy()方法实现。①获取当前类中的属性,
2023-02-06 09:28:21
393
原创 动态AOP 自动以标签 源码解析
AspectJ框架为AOP 开发提供了一套@AspectJ注解,它允许我们直接在java类中通过注解的方式对切面(Aspect)、切入点(PointCut)和增强(Advice)进行定义,Spring框架可以根据这些注解生成AOP 代理。Spring AOP 是一个简化版的AOP 实现,并没有提供完整的AOP功能,通常情况下,Spring AOP 是能够满足我们日常开发过程中的大多数场景的,但在某些情况下, 我们可能需要使用Spring AOP 范围外的某些AOP 功能。
2023-01-30 13:50:32
272
原创 源码深度解析Spring Bean的创建,手把手的一步一步带你看源码
此处方法设置得十分巧妙, 巧妙之处是Spring将一部分的方法匹配工作在这里完成, 如果当前类职工的方法只有一个的时候就设置重载方法没有被重载,这样在后续被调用的时候就可以直接使用功能此方法,从而不需要进行方法的参数匹配验证,还可以提前对方法存在性进行验证.然后: 解析构造函数并进行构造函数的实例化.因为一个bean对应的类中可能会有多个构造函数,而每个构造函数的参数不同,Spring 在根据参数及类型去判断最终会使用哪个构造函数进行实例化.
2023-01-28 13:24:39
761
原创 从源码角度带你清楚分析Spring 的Lazy-init 延迟加载机制原理
对于被修饰为lazy-init的bean,Spring 容器初始化阶段不会进行init 并且依赖注入,当第一次进行getBean的时候,才会进行初始化并依赖注入. 对于非延迟加载的bean,getBean的时候会从缓存中获取,因为容器初始化阶段Bean已经初始化完并缓存起来了.
2023-01-03 09:18:32
461
原创 一文清晰带你弄清楚Spring IOC 循环依赖问题是如何解决的
循环依赖又被成为循环引用,即两个或者多个bean相互之间的持有对方,比如A 引用B,B引用C,C 又引用A,则它们最终反映为一个环,如下图所示:循环依赖是对象之间的相互依赖关系,循环依赖就是一个死循环,除非有终结条件,否则就是死循环,最终导致内存溢出错误.
2022-12-26 15:00:47
1364
原创 从源码的角度解析Spirng 的import标签和alias标签的处理
在上一篇博客《源码深度剖析Spring Bean标签的解析及注册》中描述了bean 标签的解析以及注册。而Spring 的XML 配置文件职工包括import标签、alias标签、bean标签和beans 标签,那么这篇博客就针对剩余的import 标签 、alias标签进行处理。由于beans标签类似于import标签所提供的功能,再次就不在赘述了, 感兴趣的可以自行查看源码。
2022-12-20 11:41:13
520
原创 源码深度剖析Spring Bean标签的解析及注册
在博客《一步一步带你深入源码看Spring是如何加载XML配置文件的》中把Spring对XML配置文件如何加载的说明白了,XML配置文件加载完成后就是对标签的解析,本篇博客就是针对Spring bean 标签的解析以及bean definition 的注册。Spring 中的标签包括默认标签和自定义标签两种, 默认标签的解析是在DefaultBeanDefinitionDocumentReader.parseDefaultElement()方法中进行的,
2022-12-05 06:06:07
338
原创 一步一步带你深入源码看Spring是如何加载XML配置文件的
解析为document对象,之后就要注册beanDefinition了,在spring的加载过程中,BeanDefinition是一个重要的数据结构,它是在创建对象之前,对象数据的一种存在形式。loadBeanDefinitions()方法调用loadBeanDefinitions()方法用于加载或注册bean definitions,具体代码如下。Spring 的在实际开发过程中都是以XML 配置文件+注解的形式进行使用,那么XML配置文件的读取是Spring中重要的功能,
2022-11-28 06:11:14
1438
原创 从源码角度分析Mybatis级联映射的实现原理
Mybatis是一个半自动化ORM框架,可以将数据库中的记录转换为java实体对象,但是java实体属性通常采用驼峰命名法,而数据库字段习惯采用下划线分隔命名法,因此需要用户指定java实体属性与数据库表字段之间的映射关系。mybatis的Mapper 配置中提供了resultMap 标签,用于建立数据库字段与java实体属性之间的映射关系。Mybatis 在启动时,所有配置信息都会被转换为java对象,Mybatis 通过ResultMap类描述resultMap标签的配置信息;
2022-11-15 16:13:10
606
原创 JVM笔记:垃圾回收器总结
垃圾收集器分类作用位置使用算法特点使用场景erial串行运行作用于新生代复制算法响应速度优先适用于单CPU环境下的client模式ParNew并行运行作用于新生代复制算法响应速度优先多CPU环境Server模式下与CMS 配合使用Parallel并行运行作用于新生代复制算法吞吐量优先适用于后台运算而不需要太多交互的场景Serial Old串行运行作用于老年代标记-压缩算法响应速度优先适用于单CPU环境下的client模式并行运行作用于老年代。
2022-11-07 14:16:18
412
1
原创 JVM笔记:垃圾回收及垃圾回收算法
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便 JVM 将整理出的内存分配给新的对象。
2022-10-31 09:14:31
267
1
原创 JVM笔记:对象实例化
已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表来为对象分配内存。也可能导致OutofMemoryError异常由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。直接指针是局部变量表中的引用,直接指向堆中的实例,在对象实例中有类型指针,指向的是方法区中的对象类型数据。
2022-10-17 09:09:50
149
1
原创 JVM笔记: 垃圾回收相关概念
它用以实现对象的finalize()方法,也可以称为终结器引用。无需手动编码,其内部配合引用队列使用。在GC时,终结器引用入队。由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时才能回收被引用对象。
2022-10-13 09:27:28
206
1
原创 JVM笔记: 执行引擎
执行引擎是Java虚拟机核心的组成部分之一。虚拟机的执行引擎是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。
2022-10-08 09:34:44
317
1
原创 你知道阿里巴巴java代码规范中关于创建线程池scheduledThreadPool的错误在哪里吗
scheduledThreadPool 的最大线程数没有发挥作用。 从创建可调度线程的源码看最大线程数数为什么没有发挥作用。
2022-09-26 14:40:46
1002
1
原创 一文清晰讲明白DDD(领域驱动设计)的知识点
DDD(领域驱动设计)是一种处理高度复杂领域的设计思想,是一种架构设计方法论,是一种设计模式。以高内聚低耦合为目的,把一个复杂的软件应用系统中各个部分进行一个很好的拆解和封装,对软件系统进行模块化的一种思想。DDD不仅可以用于微服务设计,还可以很好地应用于企业中台的设计,也适用于传统的单体应用。
2022-09-22 16:27:43
6295
原创 【速看】手把手一点点带你看明白线程和线程池的状态以及状态之间是如何转换
线程有6中状态:New状态、Runnable状态、Blocked状态、Waiting状态、Time_waiting状态、Terminated状态。线程6中状态的转换关系如下图所示:从上图可以可知:(1)通过 new Thread(…)创建新线程的时候,若尾调用start()方法启动线程,那么该线程就处于new状态;
2022-09-21 09:25:01
376
原创 从源码的角度回答“mybatis的#{} 和${}有什么区别”?
在此方法中对SQL配置的所有子元素进行遍历,如果子元素类型为SQL文本,则使用TextSqlNode对象描述SQL节点信息,若SQL节点中存在${} 参数占位符,则是设置为动态SQL, 如果子元素未、、等标签,则使用NodeHandler处理,并设置为动态SQL;在了解#{ } 和${} 区别之前,我们需要先来了解一下动态SQL以及动态SQL的解析过程,动态SQL 指的是事先无法预知具体的条件,需要运行时根据具体的情况动态生成SQL语句。在解析动态sql的时候,对#{}进行了相关的解析处理。
2022-09-16 09:53:54
190
原创 【速看】一招教你快速如何快速确定线程池的线程数
线程池标准创建方式是通过标准构造器ThreadPoolExecutor去构造工作线程池。那么corePoolSize和maximumPoolSize 的该如何设置呢?在设置这两个值之前,首先需要通过任务类型对线程池进行分类, 可以分为IO密集型任务,CPU 密集型任务和混合型任务。
2022-09-15 09:27:12
1555
1
原创 一文带你清晰弄明白线程池的原理
【强制】线程资源必须通过线程池提供,不允许在程序中显示创建线程。说明:使用线程池的好处是减少在创建和销毁线程池上所消耗的时间以及系统资源的开销,解决资源不足的问题,如果不适用线程池, 有可能造成系统创建大量同类线程而导致消耗完内存或者“过渡切换”的问题。
2022-09-07 15:35:17
1203
原创 spring IOC 学习笔记整理
IOC 是Inversion of control的简写,译为“控制反转”,它不是一门技术,而是一门设计思想,Spring 通过IOC 容器来管理所有java对象的实例化和初始化,控制对象与对象之间的依赖关系。在传统的java应用中,一个类想要调用另一个类的属性或方法,通常会先在其代码中通过new Object 的方式将后者的对象创建出来,然后才能实现属性或方法的调用。即调用者掌控者被调用者对象创建的控制权。
2022-09-06 09:15:47
168
原创 一招解决IDEA 每当maven依赖有变化或Reload Project时Language Level 和Java Compiler的Target ByteCode version自动重置为低版本
手动修改 Language Level 和Java Compiler的Target ByteCode version为统一版本,但是这种方式治标不治本,每次都需要修改, 不建议使用此方法。方法三: 全局修改, 配置maven的setting.xml文件。这种方法针对单个项目进行设置,其他的非子类项目不受影响.方法二:单个项目配置pom.xml文件。
2022-08-22 09:38:34
3282
原创 通过此文让你全面了解Thread线程的基本操作
java 线程的常用操作基本上都在java.lang.Thread 类中进行了定义,基础的操作可以下图进行概括:接下来我们对每一项基本操作进行详细说明:在java编程规范中要求: 创建线程或线程池时,需要指定有意义的线程名称,方便出现bug的时候回溯.在Thread 中可以通过两种方式设置线程名称,方式一是通过构造函数Thread(…)初始化设置线程名称,方式二是通过 setName()方法设置线程名称. 想要获取线程名称就只能通过getName()方法进行获取.设置线程名称和获取线程名称的示例如下运
2022-08-17 10:34:27
265
原创 最全面的创建线程的几种方式总结,让你的需求轻松选择最合适你的线程创建方式
在java进程中,每一个线程都对应着一个Thread实例,线程的描述信息都会保存在Thread实例属性中, 供JVM进行线程管理和调度时使用功能.Thread 类是java多线程编程的基础, 创建线程有以下4中方式:- 继承Thread类创建线程类- 实现Runnable接口创建线程目标类- 使用Callable 和FutureTask 创建线程- 通过线程池创建线程...
2022-08-12 17:31:38
516
原创 jvm笔记:运行时数据区之方法区
方法区(Method Area) 是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。...
2022-08-09 13:32:50
443
原创 git提交代码至github 时,输入username和password后提示:Logon failed, use ctrl+c to cancel basic credential prompt.
git提交代码至github 时,输入username和password后提示:"Logon failed, use ctrl+c to cancel basic credential prompt."的解决方法
2022-08-04 10:16:41
1149
原创 mybatis缓存知多少
mybatis作为强大的持久层框架,缓存是必不可少的。Mybatis的缓存分为一级缓存和二级缓存,在本质上是相同的,它们都是用的Cache接口实现。
2022-08-03 09:05:22
192
原创 一招带你解决IDEA新建Module时无Spring 选项的问题
想要创建spring/spingMVC等项目时,发现IDEA的newModule中无Spring选项,如下所示.这个时候就有了,
2022-07-29 13:43:38
3575
1
原创 Tomcat10 部署springMVC提示“org.springframework.web.servlet.DispatcherServlet cannot be cast to ...“错误
此错误的原因是Spring(和SpringBoot)目前只支持JavaEE而不支持JakartaEE。这意味着它只能在与JavaEE兼容的服务器上运行。而Tomcat10是JakartaEE规范的一个实现,目前不支持该规范。唯一的解决方案是降级到tomcat9。...
2022-07-28 15:56:55
1681
4
原创 从源码角度看Mybatis如何通过拦截器实现插件的使用
Plugin.getSignatureMap()方法对Intercepts注解进行解析,首先获取Intercepts注解,然后获取ntercepts注解中配置的所有Signature注解,接着对所有的Signature注解信息进行遍历,将Signature注解中指定要拦截的组件及方法添加到Map对象中,其中Key为Executor、ParameterHandler、ResultSetHandler或StatementHandler对应的Class对象,Value为拦截的所有方法对应的Method对象数组。.
2022-07-25 09:46:49
195
原创 从源码的角度回答“mybatis的#{} 和${}有什么区别”?
在此方法中对SQL配置的所有子元素进行遍历,如果子元素类型为SQL文本,则使用TextSqlNode对象描述SQL节点信息,若SQL节点中存在${}参数占位符,则是设置为动态SQL,如果子元素未、、等标签,则使用NodeHandler处理,并设置为动态SQL;使用#{}参数占位符能够有效避免SQL注入问题,所以我们优先考虑使用#{}占位符,当#{}参数占位符无法满足需求时,才考虑使用${}参数占位符。......
2022-07-21 09:47:27
153
原创 JVM笔记:java堆
在java应用程序中,java堆 是虚拟机所管理的内存职工最大的一块,java堆是被所有线程共享的一块内存区域,在虚拟机启动时就会创建堆。 java堆的唯一目的就是存放对象实例和数组,几乎所有对象实例和数组都在这里分配内存。java堆是垃圾收集器管理的内存区域。Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。...
2022-07-18 09:42:02
233
原创 JVM笔记:java虚拟机栈
java虚拟机是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的线程内存模型,每个方法被执行的时候,java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。...
2022-07-15 09:33:49
1924
原创 从源码的角度理解并应用Mybatis的延迟加载机制与原理
延迟加载也称为懒加载。其含义是:暂时不用的对象不会真正加载到内存职工,直到真正需要使用该对象时,才会执行数据库查询操作,将该对象加载到内存中。这种方式能够在一定程度上减少数据库IO次数,提升系统性能。...
2022-07-12 13:40:32
243
原创 4步带你看懂SqlSession是如何执行Mapper过程的
Mapper由两部分组成,分别为Mapper接口和通过注释或者XML文件配置的SQL语句。SqlSession 执行Mapper过程可以分为四步:Mapper接口注册、MappedStatement注册、Mapper方法调用、SqlSession 执行Mapper。
2022-07-04 09:28:56
920
原创 开源框架(三) :你知道mybatis的初始化是怎么使用建造者模式创建对象的吗
Builder 建造者模式(创建型对象类型):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;mybatis 初始化的主要工作是加载并解析mybatis-config配置文件,映射配置文件以及相关的注解信息....
2022-06-27 09:16:51
298
模拟activiti的拦截器
2015-04-14
绕过手机验证码恶意注册
2016-08-31
oracle SQL优化到10人同时查询返回1s
2016-05-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅