Java源码分析
文章平均质量分 96
(jdk API)Java集合源码分析,常用类和一些特殊类的源码解析。
假正经的小柴
双非也有编程梦!在读大三,是一个爱看源码的小伙.....
展开
-
【源码分析】一文看透集合容器
本篇主要是对集合容器List、Set、Queue、Map常用实现类、常用方法进行个源码分析,看透内部设计。如:LinkedBlockingQueue分队列头、队列尾用不同的锁保障线程安全,这种分段的思想在其他一些集合也有出现,如ConcurrentHashMap,学习集合源码除了使用更自由之外,了解到之前不知道的思想也是很有帮助的,希望可以帮助到大家梳理知识.....原创 2024-03-28 19:17:59 · 644 阅读 · 0 评论 -
【Spring源码分析】Spring之AOP底层源码解析和@Async源码解析
Spring AOP 本质是通过CGLIB动态代理去实现的,它内部是使用的 ProxyFactory 去获取的代理对象,ProxyFactory 支持 JDK 和 CGLIB 动态代理,但是 Spring AOP 在实例化 ProxyFactory 的时候,是使用的 CGLIB 动态代理去获取的代理对象。当代理对象执行方法的时候,首先是去找到ProxyFactory中符合的Advisor,通过里面的Pointcut去筛选,然后将里面的Advice封装成MethodInterceptor对象,最后行成原创 2024-02-27 13:36:01 · 1136 阅读 · 1 评论 -
【Spring源码分析】解析配置类-ConfigurationClassPostProcessor源码分析
通过 ConfigurationClassPostProcessor 把配置类取出来进行解析;配置类只要是被 @Configuration、@Component、@ComponentScan、@Import、@ImportResource 修饰的就算是配置类; 如果配置类上存在 @Component 注解,那就会解析内部类上的配置;如果配置类上存在 @PropertySource 注解,那就会把里面修饰的配置里的k-v放入到Environment中;如果配置类上存在 @ComponentScan 注解,那就原创 2024-02-15 10:00:00 · 847 阅读 · 0 评论 -
【Spring源码分析】Spring的启动流程源码解析
1构建个DefaultBeanFactory注入进去;2构建环境:reader、scanner、一些BeanPostProcessor这些;3通过 ConfigurationClassPostProcessor 去扫描配置类;4然后去实例化容器里的 BeanPostProcessor 到 beanPostProcessors 集合中;5构建事件传播器;6 实例化非懒加载单例Bean到单例池中。原创 2024-02-10 22:12:10 · 1463 阅读 · 2 评论 -
【Spring源码分析】推断构造方法
当有多个构造 @Autowired 注解,但是 required 都为 false 的话,考虑 autowireConstructor 的逻辑。先是将所候选的构造参数个数降序排序,然后逐个去匹配,看看参数是否都能在容器中找到,找不到就换下一个,找到就用该构造原创 2024-02-03 01:03:10 · 1107 阅读 · 0 评论 -
【Spring源码分析】循环依赖的底层源码剖析
singletonObjects:缓存所有经过完成整个生命周期的单例Bean。earlySingletonObjects:缓存未经过完整生命周期的Bean,如果某个Bean出现了循环依赖,就会提前把这个暂时未经过完整生命周期的Bean放入 earlySingletonObjects 中,这个 Bean 如果要经过 AOP,那么就会把代理对象放入到 earlySingletonObjects 中,否则就是把原始对象放入 earlySingletonObjects,但是不管怎样,就算是代理对象,代理对象所代理原创 2024-01-30 15:12:07 · 1079 阅读 · 0 评论 -
【Spring源码分析】@Resource注入的源码解析
若 @Resource 中name没有赋值的话,那么就是咱们常说的:先根据属性名或者参数名进行注入,再根据类型进行注入,就是那个 BeanFactory#resolveDependency 那个方法。@Resource 注解是 jdk 中的,不是 Spring 的;@Resource 和 @Autowire 代码性能上大差不差;@Resource 中的name要是赋值了就只以 name 去查询对应的Bean,不会再根据类型去找了。@Resource 中的 name 要是赋值了,那么会经过一次解析,也就是na原创 2024-01-26 00:37:06 · 761 阅读 · 0 评论 -
【Spring源码分析】从源码角度去熟悉依赖注入(二)
筛选6步记住:@Value ---- autowireCandidate 元数据属性要为 true ----- @Qualifier 限定符若有需匹配 ------- 多Bean的话 @Primary --------@Priority ------属性名或者参数名匹配原创 2024-01-24 11:00:00 · 1344 阅读 · 1 评论 -
【Spring源码分析】扫描并注册BeanDefinition逻辑
扫描源码一般是接触Spring源码时大家首先去接触的,因为它是去扫描且过滤出符合的条件的Bean的元数据的(注意这里说的是Bean的元数据,并非全是类的元数据,在此过程中用了ASM技术去提取类的元数据进行操作),比如满足includefilter,不是接口,抽象类等等才会被加入候选…原创 2024-01-20 19:32:44 · 969 阅读 · 0 评论 -
【Spring源码分析】从源码角度去熟悉依赖注入(一)
咱说的依赖注入在生命周期就是对应着属性注入的阶段,其中有在自定义MergedBeanDefinitionPostProcessor中手动设置属性值,和设置对应的是BYTYPE还是BYNAME,还有种就是注解的解析了。前俩者就是去找对应的setter方法,后面注解的形式是通过反射的注入..................原创 2024-01-18 17:07:52 · 950 阅读 · 0 评论 -
【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑
本文阐述了 getBean 的主要流程,Bean的生命周期主要呈现在 createBean中,实例化前->加载类->实例化->实例化后->属性填充->初始化前->初始化->初始化后,当然每个阶段前后可能还有一些操作,比如一些解决循环依赖啊,用父工厂去进行操作等等等本篇博客没有提及,后续会进行对应的源码分析原创 2024-01-13 11:46:09 · 1052 阅读 · 0 评论 -
【Spring源码分析】BeanFactory系列接口解读
BeanFactory:顶层接口,提供了最基础的方法,譬如:getBean、containBean,HierarchicalBeanFactory,子接口,拓展了 层次关系,ListableBeanFactory,子接口,拓展了 枚举 能力AutowireCapableBeanFactory,子接口,拓展了 自动装配 能力ConfigurableBeanFactory,子接口,拓展了相关组件 可配置化 的能力ConfigurableListableBeanFactory,集大成者原创 2023-11-05 13:51:53 · 311 阅读 · 0 评论 -
【ReentrantLock源码分析】非公平锁的加锁和解锁
非公平锁去加锁的时候会尝试去抢俩次,也可以说三次,因为第三次抢锁条件是当当前节点的前一个节点是头节点的时候,即是空的时候,这个时候才会去再次尝试抢锁,也就是后面前面没人排队购票了,然后我正好去购票了。前俩次抢锁一个是在加锁的时候就会进行抢锁,没成功的话,调用 tryAcquire 的时候又会去进行一次抢锁,这里还包括了可重入操作,即更新 state+=1(arg)否则最后进入队列然后将线程挂起。原创 2023-11-04 11:51:46 · 219 阅读 · 0 评论 -
【Spring源码分析】Bean的元数据和一些Spring的工具
BeanDefinition 为我们统一了 bean 的元数据,bean 的元数据就是指我们使用 xml 或者注解进行配置的数据,我们的 spring 容器启动之前的第一步就是加载配置数据,这些元数据会被加载到内存中以一个个 beanDefinition 的形式保存在一个 map 中。原创 2023-10-13 15:50:08 · 346 阅读 · 0 评论 -
【Mybatis源码分析】插件机制和Pagehelper插件源码分析
在分页之前,会先去执行查询所有记录条数的sql,然后再判断给的分页参数是否合理什么的;执行查询所有记录的sql,首先是去看看你有没有设有自己的MappedStatement,其id是id+_COUNT,比如我执行的分页方法是query,那就判断你有没有query_COUNT方法。否则的话Mybatis会为你创一个MappedStatement,这个MappedStatement大部分参数是继承这个查询对应的MappedStatement的参数,比如是否开启二级缓存,那么它会与那个查询对应的Mappe原创 2023-09-15 21:49:10 · 175 阅读 · 0 评论 -
【Mybatis源码分析】动态代理的使用(Javassist、CGLIB、JDK动态代理)
在使用执行器准备执行对应 SQL 时——会调用 MappedStatement.getBoundSql(param) 也就是调用 SqlSource.getBoundSql(param)——我们所说的${}在解析动态SQL的时候其实它对应的就是 TextSqlNode,在getBoundSql执行中就会把 ${} 替换成对应的参数值,#{} 会用 ? 去替换,这个时候就得到真正的sql片段原创 2023-09-07 22:03:14 · 402 阅读 · 0 评论 -
【Mybatis源码分析】Mybatis查询流程(一级、二级缓存、懒加载原理)
个人觉得一级缓存就是去针对嵌套查询的,因为在实际开发中 SqlSession 的生命周期很短,那么一级缓存可以说就是针对 SqlSession 这个会话域中的在内存中的一个缓存,虽然在查询的过程也会去从一级缓存中取,但是最实用的地方还是在属性映射的时候遇到嵌套查询,然后去一级缓存看看有没有存在结果集。二级缓存的话我觉得是一个全局的缓存,需自己在Mapper中配置cache标签表示使用二级缓存,且要在对应的语句标签上写上 useCache 属性为 true,表示这个语句使用二级缓存,然后会在对应的 Map原创 2023-09-05 23:53:40 · 391 阅读 · 0 评论 -
【Mybatis源码分析】Mybatis 是如何实现预编译的?
Mybatis 实现预编译主要是在执行 sql 前,会调用一个 prepareStatement 方法进行预处理,会传一个 StatementHandler 对象进去,本质是一个 RoutingStatementHandler,但其构造方法其实就是一个路由的作用,内部封装了一个委托者才是真正的执行者。其委托者实现了 instantiateStatement (实例化 Statement) 方法。该方法就是 Mybatis 实现预编译的关键。prepareStatement方法会调用 BaseStatem原创 2023-08-25 08:15:00 · 592 阅读 · 0 评论 -
【Mybatis源码分析】解析语句标签_Select|Update|Insert|Delete
解析语句标签的核心内容在 XMLStatementBuilder.parseStatementNode 方法中,解析完标签内容然后将其通过 MapperBuilderAssistant 对象映射成 MapperStatement 然后封装到 Configuration 中的 mappedStatements 中。原创 2023-08-21 15:01:42 · 249 阅读 · 2 评论 -
【Mybatis源码分析】动态标签的底层原理,DynamicSqlSource源码分析
DynamicSqlSource 是用 DynamicContext 对象中的 sqlBuilder 对象进行动态Sql片段拼接的,它是一个StringJoiner对象,以空格分隔开片段。解析映射xml中的动态sql标签是封装在SqlNode对象中,其中是通过 MixedSqlNode 混合 SqlNode 进行遍历,然后通过递归的一种形式进行处理的。SqlSourceBuilder.parse 进行了sql 最后的处理,处理了#{},并对参数进行了封装。原创 2023-04-29 15:14:30 · 1794 阅读 · 0 评论 -
【Mybatis源码分析】类型处理器(TypeHandler)及其注册
写类型处理器,可以选择继承BaseTypeHandler类,也可以选择去实现TypeHandler接口。如果不想在配置文件中去配置对应的Java类型的话,那就使用@MappedTypes注解进行配置(当然可以配置多个,因为一个处理器可以对应多个Java数据类型嘛,可以达到一致效果的也可以配置,从而达到复用)。原创 2023-04-15 11:48:54 · 1259 阅读 · 0 评论 -
深入底层谈谈String
字符串对象之间的拼接底层会创建一个空的StringBuilder对象,然后通过append方法进行拼接;如果是纯字符串拼接,那么底层会直接进行拼接,然后去字符串常量池中找。(字符串常量池是通过哈希表实现的,如果字符串存在的话就会返回其对应的引用)String对象不可变性、不可拓展性源于起内部实现是一个final类型的value数组,String类是final型的。原创 2023-04-10 13:16:03 · 193 阅读 · 0 评论 -
【Mybatis源码分析】Mybatis中的反射(MetaObject)详细讲解
文章总结:可以通过MetaObject对象对实例对象属性赋值和获取;ObjectFactory工厂对象可拓展;PropertyTokenizer类用了迭代器设计模式,对属性名进行操作迭代;BeanWrapper依赖MetaClass,MetaClass依赖反射工厂对象和反射对象;Reflector对象是对实例对象构造器、getter、setter方法、属性名等的封装;编写Bean对象的时候,应该遵循Bean规范,使得get后和set后可以和属性名原创 2023-04-01 16:23:53 · 2126 阅读 · 15 评论 -
【Mybatis源码分析】TypeAliasRegistry源码分析
Mybatis通过TypeAliasRegistry对象实现对别名的封装,实现别名对应Java类型的校验。TypeAliasRegistry类中是用一Map成员对象实现上面封装效果的。原创 2023-03-28 18:29:40 · 275 阅读 · 1 评论 -
【Mybatis源码分析】datasource配置${}表达式时是如何被解析的?
解析顺序和核心配置DTD约束是一致的,XPathParser 对象都是使用的 XMLConfigBuilder 内的属性 parser 对象。variables 解析其他标签也都是共享的,一级传一级的。所以也就是说解析 datasource 是可以使用共享的 variables 的。然后通过共享的variables就可以得到对应配置文件中的数据了。原创 2023-02-22 21:05:10 · 853 阅读 · 7 评论 -
【Java容器(jdk17)】ArrayList深入源码,就是这么简单
ArrayList 是基于动态数组实现的,当进行插入或删除操作的时候,都会进行数组的拷贝复制。ArrayList 它很多地方是分步进行操作的,而且内部元素也是可以为 null 的。它不是线程安全的。ArrayList 删除元素时,只会改变元素的个数(size),而不会改变容量(elementData.length),如果想要更改,可以调用trimToSize()方法,它会给你改成和元素个数一样的值。原创 2023-02-11 15:33:58 · 590 阅读 · 0 评论