源码
文章平均质量分 76
奔跑的蜗牛...
这个作者很懒,什么都没留下…
展开
-
spring源码aop解析xml生成bean定义信息
spring面向切面编程是咱们工作中使用比较频繁的一项技术,比如:日志、事务、表单重复提交等了解aop之前需要先了解几个概念什么是aspect :切面什么是连接点:切面方法切入点表达式:用于过滤目标方法的过滤器什么是织入:所有切面方法的总称什么是目标方法:被代理的对象方法看下AOP处理器public class AopNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() {原创 2022-05-10 17:51:10 · 214 阅读 · 0 评论 -
spring源码如何解决循环依赖
到这里咱们IOC简单流程基本上算结束了,但是有一个非常火热的解决方案值得咱们深入了解下,那就是循环依赖下面咱们从这三个维度去分析:什么是循环依赖?造成循环依赖的原因是什么?spring是怎么解决的循环依赖?最后演示下流程什么是循环依赖?咱们都知道,spring创建bean分为实例化、填充属性、初始化等,当对象完成实例化后开始给属性赋值,这时咱们再去想一个场景,如果一个对象A有属性B b,对象B有一个属性是A a,咱们设想下,spring开始创建A对象对,然后给A对象的属性b进行赋值,那么这原创 2022-05-06 00:03:23 · 531 阅读 · 0 评论 -
spring源码注册需要销毁的bean registerDisposableBeanIfNecessary
前篇文章传送门咱们上篇了解bean的初始化,大家可以想下,bean为什么要销毁?用完不再使用的bean指定了destroy方法的bean执行destroy方法容器关闭spring把需要销毁的bean注册到哪里呢?disposableBeans = new LinkedHashMap<>();在何时进行销毁的?registerDisposableBeanIfNecessary 注册需要被销毁的beanprotected void registerDisposableBeanI原创 2022-05-05 11:21:41 · 176 阅读 · 0 评论 -
spring源码执行bean的init方法 initializeBean
前篇文章传送门前两篇了解了bean的属性性赋值,这个过程如果字段是引用类型的对象,那么spring会去工厂中查找,如果查找不到,再去执行工厂创建bean的那套流程,现在属性赋值完成了后,接下来开始执行init方法了。那么执行init方法前后会做哪些事情呢?invokeAwareMethods Aware接口是做什么的?postProcessBeforeInitialization 作用是什么?什么时候执行init方法?applyBeanPostProcessorsAfterInitializa原创 2022-05-04 14:22:13 · 1603 阅读 · 0 评论 -
spring源码对属性赋值 populateBean (XML)
前篇传送门上篇文章了解了spring注解是如何进行赋值操作,接下继续看看xml配置是如何进行赋值的先想一个问题,xml中配置有哪些类型?RuntimeBeanReference bean对象RuntimeBeanNameReferenceBeanDefinitionHolderBeanDefinitionDependencyDescriptorManagedArray 数组ManagedList List集合ManagedSet set集合ManagedMap mapManaged原创 2022-05-03 18:33:34 · 643 阅读 · 0 评论 -
spring源码对属性赋值 populateBean(注解)
前篇文章传送门上篇咱们聊到了bean的实例化,在里面了解常见的几种实例化bean的方式,那么bean实例化完成只是一个空的bean,一个空属性的bean对于咱们来说没什么实际意义的。接下来咱们来了解bean的属性是如何进行赋值的。咱们如何给对象赋值的呢?咱们平常开发中给对象赋值无非两种方式通过构造器通过set方法那spring是如何做的呢?属性有哪些类型呢?咱们继续看看spring源码中是如何进行赋值的hasInstantiationAwareBeanPostProcessors 修改原创 2022-05-02 11:19:40 · 578 阅读 · 1 评论 -
spring源码合并bean定义信息 applyMergedBeanDefinitionPostProcessors
上篇咱们聊到了bean实例的创建,按照流程图上面接下来应该进行属性填充了。这在里咱们思考一个问题,咱们@Autowired,@Value,@Resource,@PostConstruct,@PreDestroy是什么时候处理的呢,假如xml中配置了,注解也配置了,应该怎么处理呢?AutowiredAnnotationBeanPostProcessor 处理@Autowired和@Value注解bean定义信息CommonAnnotationBeanPostProcessor 处理@Resource、@原创 2022-04-25 23:52:07 · 728 阅读 · 0 评论 -
记录短信模块系统设计,采用redis队列(SMS)
本章内容是完整流程,只对粉丝开放背景随着系统用户越来越多,业务流程越来越完善,但同时也暴露出了一些问题,比如,关键的流程节点用户比较关注,可能会涉及到时效性,用户只有登录到系统才能看到流程阶段信息。为了解决流程关键节信息差,时效性差等问题,项目决定对接短信。业务模块:目前项目业务模块分为三个部分,以后有可能会增加其他模块。AA 模块BB 模块CC 模块表设计sms_config:短信配置表,用于存储短信提供方模板标识和占位符参数获取方法sms:短信表,用于存储短信内容相关信息原创 2022-04-22 22:02:55 · 1608 阅读 · 0 评论 -
spring源码实例化bean createBeanInstance
前篇文章传送门上篇咱们聊到了doCreateBean方法,在里面了解到先进行获取bean的实例,然后给属性赋值,再调用bean的初始化方法,如果需要的话会把bean注册到销毁容器中。接下来咱们了解下实例化的流程spring实例化有哪些方式可以试想下,如果让咱们自己实现实例化bean,会如何做?通过supplier通过FactoryBean通过构造方法(反射)…源码protected BeanWrapper createBeanInstance(String beanName, Root原创 2022-03-24 22:46:05 · 544 阅读 · 0 评论 -
spring源码实例化剩余的bean finishBeanFactoryInitialization
前篇文章传送门咱们前面了解了spring容器创建,然后加载了bean的定义信息,执行了BDRPP,执行了BFPP,注册了BPP,前面的这么多步骤,就是为了创建Bean实例并初始化,接下来咱们了解剩下的流程概括咱们都知道,前面的步骤创建了很多内部使用的bean,但是真正咱们使用bean大部分没有创建,为什么说大部分呢,因为BDRPP、BFPP、BPP这个时间已经创建完了,并且BFPP已经执行完了。说了这么多没用的,咱们看下剩下的流程吧getBeandoGetBeangetSingletoncr原创 2022-03-22 00:00:42 · 398 阅读 · 0 评论 -
spring 源码注册BPP-registerBeanPostProcessors
上篇传送门前两篇咱们了解了component-scan和其他一些注解的解析成bean定义信息的过程,前者是通过XML的方式loadBeanDefinition,后者通过ConfigurationClassPostProcessor来实现,那么这时候,bean的定义信息基本上算是完成了,接下来进行注册BPPBPP就是用来拦截bean的创建,在初始化前后进行增强,具体细节咱们后面会详聊获取所有BPP的bean名称创建一个BeanPostProcessorChecker遍历BPP名称分组并实例化注原创 2022-03-20 21:16:50 · 588 阅读 · 0 评论 -
spring 源码执行BFPP invokeBeanFactoryPostProcessors-ConfigurationClassPostProcessor (2)
上篇传送门上篇介绍了component-scan标签的解析,把扫描到的@Component类文件扫描到,然后生成bean定义信息并注册到工厂,工厂注册完后,又注册了注解解析内部定义信息(后置处理器)以及监听器,接下来咱们继续看下是如何执行后置处理器的...原创 2022-03-20 16:13:05 · 300 阅读 · 0 评论 -
spring源码TX 事务环境准备
源码构建准备事务环境之前,必须要保证aop环境gradle配置dependencies { compile(project(":spring-beans")) compile(project(":spring-core")) compile(project(":spring-context")) compile(project(":spring-webmvc")) compile(project(":spring-jdbc")) compile(proj原创 2022-03-18 11:44:15 · 314 阅读 · 0 评论 -
spring源码AOP环境准备
还没构建源码可以参考文章构建学习aop源码之前首先需要有环境,很多小伙伴可能会卡在这里,接下来咱们看看aop的配置前提已经安装了aspectj-1.9.3.jar,没有安装的参考上面的链接gradle配置到你测试工程下找到build.gradle文件修改配置找到文件的最下方,添加依赖dependencies { compile(project(":spring-beans")) compile(project(":spring-core")) compile(pro原创 2022-03-18 11:01:17 · 464 阅读 · 0 评论 -
spring源码加载bean定义信息 loadBeanDefinitions-自定义标签解析(component-scan-2)
上篇传送门上篇大体了解了下执行BFPP的过程,BFPP的作用也介绍了,但是并没有深入看下如何实现的,接下来咱们了解下context:component-scan 标签是如何解析的概述咱们开发过程中会使用到很多的注解配置等,这些注解必须要被扫描到才能被识别spring中标签分为几种分为两种标签自定义标签(除了bean标签外)源码之前先了解两个类DefaultBeanDefinitionDocumentReader 调度者BeanDefinitionParserDelegate 解析策原创 2022-03-15 16:39:24 · 543 阅读 · 0 评论 -
spring 源码执行BFPP invokeBeanFactoryPostProcessors (1)
上篇传送门上篇咱们了解了工厂创建,bean定义信息的加载,这篇咱们来探索下BFPP源码之前先了解两个接口的作用BeanFactoryPostProcessor 对BeanDefinition进行增强BeanPostProcessor 对bean的初始化前后进行增强AbstractApplicationContext.invokeBeanFactoryPostProcessors 执行BFPPprotected void invokeBeanFactoryPostProcessors(Conf原创 2022-03-13 16:49:23 · 872 阅读 · 0 评论 -
spring源码加载bean定义信息 loadBeanDefinitions
上编文章咱们已经把工厂容器准备好了,那么既然是容器就会存放数据,它是怎么存放的呢?咱们先看下bean定义信息的类关系loadBeanDefinitions这个方法调用比较深,过渡流程AbstractXmlApplicationContext.loadBeanDefinitions 创建bean定义信息的读取器AbstractXmlApplicationContext.loadBeanDefinitions(beanDefinitionReader)使用读取器进行加载bean的定义信息Abst原创 2022-03-07 12:48:55 · 375 阅读 · 0 评论 -
spring 源码通过xml方式容器刷新前的准备
简介spring大体可以分为两个路线,一个是容器(DefaultSingletonBeanRegistry),一个是应用上下文(ApplicationContext),它们都是子BeanFactory的实现DefaultSingletonBeanRegistry 用于缓存bean定义信息及beanApplicationContext 上下文,用于保存spring应用过程的信息接下来是以XML解析的方式深入探索源码还没有构建的可以参考ClassPathXmlApplicationContex原创 2022-03-06 15:39:07 · 308 阅读 · 0 评论 -
spring源码大体了解
简介相信大家都在使用spring,也都知道spring是做什么的,有哪些模块,也都知道spring最重要的两个核心功能IOC,AOP,那么他是怎么实现的呢,为什么spring构建的是生态呢?,接下来咱们一起探索下这两个模块。IOC 控制反转,依赖注入控制反转什么是控制反转呢,到底是谁控制了谁?控制反转:本来需要咱们自己创建的对象交给spring去创建。比如:咱们xml标签配置的标签、@Bean、@Service …,这些对应的类都会被spring创建成对象,放到spring容器中,等咱们使用的就原创 2022-03-04 16:06:09 · 423 阅读 · 0 评论 -
SpringMVC执行流程
简介咱们都知道,springmvc是客户端和服务端的桥梁,那么它是怎么运行的呢?类图大家都知道,springmvc的核心处理类是DispatcherServlet,它是如果被执行的?从下图可以看出,DispatcherServlet继承了FrameworkServlet而FrameworkServlet继承了HttpServletBean,实现了ApplicationContextAwareHttpServletBean继承了HttpServletHttpServlet继承了GenericSe原创 2021-12-08 13:23:06 · 1657 阅读 · 0 评论 -
spring源码构建mac和windows通用
环境准备JDK8源码导入后,mac默认使用的是openjdk8,不要切换idea 2019.xgradle-5.6.41、官网下载2、选择 gradle-5.6.4-bin.zip3、解压4、配置环境5、验证win+Rcmdgradle -v6、配置镜像地址在gradle-5.6.4\init.d下创建文件init.gradle把下面内容粘贴进去allprojects{ repositories { def REPOSITORY_URL = 'h原创 2021-12-03 13:06:12 · 377 阅读 · 0 评论 -
HashMap源码get-JDK8
前言了解hashmap.get(O)方法之前,首先要先了解下内部的数据结构时间复杂度从上图可以看出,table[index]元素存在四种情况tanble[index] 是 null 时 时间复杂度是 O1tanble[index] 是 单个Node对象 时 时间复杂度是 O1tanble[index] 是 Node链表 时 时间复杂度是 Ontanble[index] 是 TreeNode红黑树 时 时间复杂度是 Ologn源码get(Object key)获取value//获取最重原创 2021-11-29 12:58:51 · 472 阅读 · 1 评论 -
HashMap源码put方法JDK8
继承关系重要的成员及内部类Node类static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next;TreeNode类static final class TreeNode<K,V> extends LinkedHashMap.Entry&l原创 2021-11-28 14:05:33 · 2991 阅读 · 0 评论