Spring
文章平均质量分 85
超硬核Spring源码解析系列!剖析Spring源码核心模块,学习Spring容器和依赖注入相关的核心源码,tigaoJava程序员的核心竞争了
小王曾是少年
通信工程本硕 for NJU ;
《Intelligent Passive Eavesdropping in Massive MIMO-OFDM Systems via Reinforcement Learning》IEEE WCL 作者;
申请国家发明专利2项;
淘天集团后端开发;
有事尽量私信
展开
-
SpringBoot的启动流程源码解析
文章目录1 前言2 追本溯源3 容器启动流程3.1 应用启动计时3.2 打印 Banner3.3 创建上下文实例createApplicationContext3.4 构建容器上下文prepareContext3.5 小结1 前言在拥有 Spring Boot 以前,我们要运行一个 Java Web 应用,首先需要有一个 Web 容器(例如 Tomcat ),然后将我们的 Web 应用打包后放到容器的相应目录下,最后再启动容器。在 IDE 中也需要对 Web 容器进行一些配置,才能够运行或者 Deb原创 2021-12-08 18:36:09 · 1540 阅读 · 12 评论 -
阅读Spring源码第一步:源码编译与创建调试入口
文章目录1 源码下载与编译2 创建学习入口1 源码下载与编译 Spring开源框架经过很长时间的发展,各个模块均已成熟,一个常识就是一个可靠,可扩展的高性能框架,它的代码行数是相当可观的,我用static插件简略测算了一下,Spring的源码有100多万行,可以想象其中的调用逻辑是相当复杂的,所以将Spring源码下载到本地再编译的话,我们就可以通过IDE的debug来来到抽丝剥茧分析源码的目的,并且我们可以很方便的使用idea来查看调用栈,方法的调用关系也就比较明了了。下载Spring源码:htt原创 2021-03-30 00:12:14 · 827 阅读 · 0 评论 -
【Spring源码解析】SpringIOC(1)—— Bean与BeanDefinition
文章目录全局掌握核心接口和类Bean与BeanDefinition全局掌握核心接口和类解决了关键的问题:将对象之间的关系转而用配置来管理依赖注入 —— 依赖关系在Spring的loC容器中管理通过把对象包装在Bean中以达到管理对象和进行额外操作的目的Bean与BeanDefinitionBean是Spring的一等公民:Bean的本质就是java对象,只是这个对象的生命周期由容器来管理不需要为了创建Bean而在原来的java类上添加任何额外的限制对java对象的控制方式体现原创 2021-09-10 22:25:26 · 468 阅读 · 0 评论 -
SpringIOC源码解析(2)—— 简单容器
文章目录BeanFactory 和 FactoryBean 的区别BeanFactory源码首先要明确两点:所有的IOC接口都要实现接口BeanFactory。IOC容器的设计主要分为两个主要路线:BeanFactory和ApplicationContext分别为核心。BeanFactory 和 FactoryBean 的区别前者是spring的根接口,定义了Bean工厂最基础的功能特性,是一个Factory后者是用来生成普通的bean,实现了这个接口之后,spring会在容器初始化时会把原创 2021-09-12 11:38:12 · 283 阅读 · 0 评论 -
SpringIOC源码解析(3)—— 高级容器
文章目录ApplicationContext家族体系ApplicationContex继承的接口ApplicationContext常用容器传统的基于XML配置的经典容器目前比较流行的容器(都是基于注解的)ApplicationContext家族体系高级容器均实现了ApplicationContex这个接口,为了区别于普通容器,高级容器一般被称为Contex(上下文),之所以是高级容器,因为它实现了更多的接口:ApplicationContex继承的接口Environment可以理解为容器的一原创 2021-09-18 22:45:56 · 269 阅读 · 0 评论 -
SpringIOC源码解析(4)—— Resource、ResourceLoader、容器之间的微妙关系
文章目录Resource家族EncodedResourceAbstractResourceWritableResource根据资源地址自动选择正确的Resource配置就是xml,spring将对物理资源的访问方式抽象成Resource。Resource家族Resource是个接口,继承了InputStreamSource,定义了资源的基本操作(全是读操作)InputStreamSource有唯一一个方法getInputStream主要是根据不同的资源,定义了不同类的实现。Servlet原创 2021-09-21 23:00:18 · 491 阅读 · 0 评论 -
SpringIOC源码解析(5)—— 通过document对象解析出BeanDefinition实例
在《SpringIOC源码解析(3)—— Resource、ResourceLoader、容器之间的微妙关系》文末,将xml文件解析成了Document对象,接下来就该调用registerBeanDefinitions来解析Document对象。public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException { // 创建BeanDefinitionDocu原创 2021-10-12 19:57:09 · 198 阅读 · 0 评论 -
SpringIOC源码解析(6)—— BeanDefinition的注册
文章目录BeanDefinitionRegistry负责对BeanDifinition的注册,其中的方法:/** * 往注册表中注册一个新的 BeanDefinition 实例 */void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;/** * 移除注册表中它注册的 BeanDefinition 实例 */原创 2021-10-22 22:33:05 · 194 阅读 · 0 评论 -
SpringIOC源码解析(7)—— xml配置的资源定位、加载、解析、注册全链路分析
文章目录调用过程复现:在DefaultListableBeanFactory的registerBeanDefinition里打上断点,运行Entrance,观察调用栈:Entrance源码:阅读Spring源码第一步:源码编译与创建调试入口注册是从主函数开始的:之后进入到FileSystemXmlApplicationContext的构造函数:public FileSystemXmlApplicationContext(String configLocation) throws Bean原创 2021-10-24 11:04:28 · 197 阅读 · 0 评论 -
SpringIOC源码解析(8)—— 注解配置的资源定位、加载、解析、注册全链路概览
在DefaultListableBeanFactory的registerBeanDefinition方法中的打上断点,Entrance程序入口换成:AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Entrance.class);源码:阅读Spring源码第一步:源码编译与创建调试入口注解容器启动时会有一些系统自带的BeanDefinition注册到系统中。原创 2021-10-25 21:46:49 · 297 阅读 · 0 评论 -
SpringIOC容器初始化源码解析(1)—— PostProcessor
文章目录后置处理器PostProcessorBeanDefinitionRegistryPostProcessor后置处理器PostProcessorPostProcessor本身也是一种需要注册到容器里的Bean:其里面的方法会在特定的时机被容器调用实现不改变容器或者Bean核心逻辑的情况下对Bean进行扩展对Bean进行包装,影响其行为、修改Bean的内容等大类分为容器级别的后置处理器以及Bean级别的后置处理器:BeanDefinitionRegistryPostProcesso原创 2021-10-27 21:26:02 · 255 阅读 · 0 评论 -
SpringIOC容器初始化源码解析(2)—— Aware及其子接口
文章目录从Bean里获取到容器实例并对其进行操作public interface Aware {}仅仅是个空的接口,只能当做标签来使用,真正能发挥作用的是继承了这个接口的子接口。当类需要容器提供帮助的时候,就需要向容器证明类本身是可以感知到容器的存在的,即实现特定类型的aware接口。...原创 2021-10-31 21:12:32 · 222 阅读 · 0 评论 -
SpringIOC容器初始化源码解析(3)—— 事件监听器模式
文章目录示例代码回调函数Spring的事件驱动模型监听器将监听感兴趣的事件,一旦事件发生,便做出响应,有以下几个概念:事件源(Event Source)事件监听器(Event Listener)事件对象(Event Object) 主要负责在事件源和事件监听器之间的信息传递示例代码package demo.pattern.eventmode;import lombok.Getter;import lombok.Setter;@Getter@Setterpublic clas原创 2021-11-02 21:53:34 · 220 阅读 · 0 评论 -
SpringIOC容器初始化源码解析(4)—— 手撕Spring容器的刷新逻辑(较硬核)
文章目录refresh的源码如下:@Overridepublic void refresh() throws BeansException, IllegalStateException { // 给容器refresh加锁,避免容器处在refresh阶段时,容器进行了初始化或者销毁的操作 synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. // 调用容原创 2021-11-04 21:11:04 · 320 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(1)—— Spring的依赖注入概览
文章目录Spring在Bean实例的创建过程中做了很多精细化控制我们需要做的是理清脉络,不要陷入细节之前有分析到过DefaultListableBeanFactory的preInstantiateSingletons方法中调用了getBean方法@Overridepublic Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false);}...原创 2021-11-11 10:34:38 · 964 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(2)—— doGetBean之从缓存获取Bean
文章目录直接打开AbstractBeanFactory的doGetBean方法:protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { // 先将方法传入的name转换成容器真实的beanNam原创 2021-11-14 22:12:52 · 1341 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(3)—— doGetBean之剩余逻辑
文章目录doGetBean源码:protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { // 先将方法传入的name转换成容器真实的beanName // 之前可以通过三种形式获取beanN原创 2021-11-17 09:43:51 · 759 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(4)—— Bean的创建(createBean)
文章目录createBean方法的执行流程如下:在AbstractBeanFactory的doGetBean的创建bean的方法里打上断点:多放行几次看到了自定义的bean:step into之后来到AbstractAutowireCapableBeanFactor的createBean中:protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) th原创 2021-11-18 16:48:02 · 758 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(5)—— doCreateBean之创建无属性的bean
上一篇文章分析到createBean执行到了doCreateBean方法:自定义的WelcomeController下面有一个成员变量WelcomeService被@Autowired标签标记进入到doCreateBean方法里:protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCrea.原创 2021-11-19 23:07:35 · 927 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(6)—— doCreateBean之处理@Autowired以及@Value标签
文章目录进入到上面的applyMergedBeanDefinitionPostProcessors方法里:protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanc原创 2021-11-20 20:54:13 · 1109 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(7)—— doCreateBean之剩余逻辑(解决循环依赖的源头)
前置文章:doCreateBean之创建无属性的beandoCreateBean之处理@Autowired以及@Value标签doCreateBean完整源码如下:protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // Instantiate原创 2021-11-22 21:46:39 · 861 阅读 · 0 评论 -
Spring支持所有循环依赖的情况吗?
循环依赖的情况如下:构造器循环依赖(singleton,prototype)Setter注入循环依赖(singleton,prototype)对于prototype来说,Spring是不支持相关的循环依赖的观察doGetBean源码:解决循环依赖的关键在于单例的三级缓存,三级缓存还保证了取出的bean的唯一性,所以三级缓存支持不了prototype因为没有设置三级缓存进行支持:只能通过将Bean名字放入缓存里阻断无限循环Spring只支持Singleton的setter循环依原创 2021-11-24 20:59:14 · 716 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(8)—— 单例循环依赖的解决
这一讨论的前提是要对Spring的doCreateBean方法有所了解,故将其源码放在这里,以供参考:protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // Instantiate the bean. // bean实例包装类 BeanW原创 2021-11-23 20:17:49 · 720 阅读 · 0 评论 -
SpringloC容器的依赖注入源码解析(9)—— populateBean
站在设计者的角度设计populateBean:调用Bean的Setter方法实例去给Bean设置上属性值变量类型的转换,同时还要考虑处理集合类型的情况配置的时候都是以字符串的形式来配置的处理显式自动装配的逻辑(autowire = byName或byType)用两个类来做测试,GirlFriend类中注入了BoyFriend的实例,BoyFriend中注入了自己的实例:package com.wjw.dao.impl;import org.springframewor原创 2021-11-25 23:02:14 · 996 阅读 · 1 评论 -
SpringloC容器的依赖注入源码解析(10)—— populateBean的剩余逻辑
populateBean的前置逻辑文章protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { if (bw == null) { if (mbd.hasPropertyValues()) { throw new BeanCreationException( mbd.getResourceDescription(), beanName, "原创 2021-11-26 22:29:58 · 465 阅读 · 0 评论