
Spring原理篇
文章平均质量分 71
Spring原理解析,不仅会用,还要会创造。
诗人不写诗
当你足够努力时,全世界都会给你让路
展开
-
Spring Bean生命周期
注入ApplicationContext(此时Bean还未初始化)。:若Bean实现了Aware接口,容器会回调相关方法注入上下文信息。:通过构造函数或工厂方法创建Bean的实例(此时对象尚未初始化)。),将Bean的定义(如类名、作用域、初始化/销毁方法等)加载到。:在Bean实例化前,允许修改Bean的定义(如属性占位符替换。或XML配置,注入依赖的属性和Bean。:Bean完全初始化,可被应用程序使用。:增强Bean(如生成代理对象)。:JSR-250标准,最先执行。:Spring特定接口。原创 2025-03-07 08:54:16 · 300 阅读 · 0 评论 -
Spring为什么要用三级缓存解决循环依赖
A、B 、C对象构成了循环依赖的场景,假设先创建A,实例化A,填充属性b,到1级、2级、3级缓存中都没有找到,决定创建B,实例化B,填充属性a。一、Spring的现有流程。原创 2025-02-20 18:22:58 · 73 阅读 · 0 评论 -
Spring cloud配置中心动态更新的原理
Spring cloud下的微服务为了能动态感知配置中心的变化,多生成了一个ApplicationContext,由于ApplicationContext聚合了Environment,所有同时也多生成了一个Environment。这个新的ApplicationContext专门用于和配置中心交互,contextId为bootstrap。原创 2024-09-06 09:58:48 · 339 阅读 · 0 评论 -
Spring Boot-加载配置文件ConfigDataEnvironmentPostProcessor
org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor是 Spring Boot 中的一个关键组件,它负责处理配置数据(config data),并将其应用于 Spring 应用上下文中。下面我们详细解读这个类的产生背景、作用和工作原理。原创 2024-08-20 20:19:03 · 589 阅读 · 0 评论 -
spring中设计概念
接口的设计哲学是通过一种灵活、解耦的方式来增强组件的功能,同时保持代码的清晰性和可维护性。接口的回调方法通常在bean初始化阶段调用,确保bean在完全初始化之前就已经获得了必要的上下文信息。bean作为观察者等待Spring容器的通知,而Spring容器作为主题负责通知bean有关的上下文信息。接口允许Spring管理的bean在初始化过程中获得对Spring应用上下文或容器的引用,以及其它相关的信息。的引用,组件可以在运行时被Spring容器动态地填充必要的信息,这使得组件更加灵活和可测试。原创 2024-07-04 20:06:58 · 531 阅读 · 0 评论 -
Spring事务-事务传播特性实战
事务传播是Spring提供给使用者用来在复杂调用关系中控制事务行为的特性。当调用关系比较复杂且有异常并捕获时,容易出现难以控制的情况。其中的要点就是:传播特性是Spring层面的,实际对应的是数据库的begin transaction,rollback,commit等命令。@Transaction注解就是在方法开始前增强begin transaction,方法中rollback,方法结束commit操作。注意同一个类中方法调用时使用jdk动态代理增强的效果,后面被调的方法是不会被增强的。原创 2023-02-15 21:54:00 · 209 阅读 · 0 评论 -
Spring事务-事务传播
数据库层面一般来说,MySQL中事务是不存在嵌套的可能的,因为每一个start transaction命令都会隐式执行一个commit命令,所以几乎无法创造出事务嵌套的可能。但是可以通过save point命令设置回滚点,模拟出嵌套事务的效果。应用层面对于应用层面来说,情况会复杂很多,因为编程使用的是方法,嵌套调用是非常常见的现象,应用该如何表现事务的效果就需要归纳出来,供用户使用。Spring事务spring声明式事务是通过生成代理类来实现的,使用jdk动态代理有个很明显的特点,就是如原创 2022-03-17 23:54:14 · 969 阅读 · 0 评论 -
Spring事务1-JDBC事务|Spring编程事务
在jdbc编程中,事务是手动提交的,spring接管事务后,整个流程被透明化的东西很多,作为编程人员是应该了解什么被透明化了,不然无法了解事情的本质。原创 2018-07-08 14:50:50 · 335 阅读 · 1 评论 -
Spring原理提前理解
如果一个bean有多个构造方法,Spring默认使用无参构造方法,此时如果没有无参构造方法,就会报错,此时可以使用@Autowired修饰构造方法用以告知Spring使用确定的构造方法。6、cglib通过继承方式生成代理对象,代理对象里会插入一个原生对象target,所以代理对象里会看到原生对象里的属性,且属性值都为Null,d、创建对象时,一定会伴随构造方法的调用,这是JAVA的强制要求,如果创建的是子类对象,一定会有构造方法链式调用的过程。4、Spring在实例化bean时,必须调用构造方法。原创 2024-01-17 21:05:59 · 453 阅读 · 0 评论 -
Spring Boot-1-IoC容器设计原理
IoC即Inversion of Control控制反转,反转的是依赖对象的创建工作。IoC后来被起了一个更好听的名字,就叫做DI:依赖注入。正常情况下,自己引用的对象由自己控制,也即自己new出来,这是非常主流和合理的方式,但是这个过程如果要靠自身实现,那么会让类型耦合并且难以测试。但是IoC颠覆了这个认知,自己引用的对象可以不由自己new了,全部交给容器,你只需要告诉容器你需要哪个对象即可,由容器控制对象的创建和分配,这就是控制反转的含义。一般情况下,面向对象编程中,对象和对象之间绝大多数情况下原创 2019-11-23 22:56:06 · 459 阅读 · 1 评论 -
Spring Boot-2-ApplicationContext设计
ApplicationContext是Spring对外提供核心能力的类,他是IoC容器的代表,开发人员可以拿到ApplicationContext并调用其方法获取Bean,使用这个类,就是在使用Spring的核心能力。原创 2022-07-03 12:09:02 · 593 阅读 · 0 评论 -
Spring Boot-3-AbstractApplicationContext
同时,一个名为applicationEventMulticaster的multicaster在context中以bean的形式提供,并提供默认实现SimpleApplicationEventMulticaster。AbstractApplicationContext是application context的第一个实现者,还是被定义为抽象的,之所以定义成抽象的,是因为他不必、不允许被实例化,不能直接被其他类聚合(他的子类可以)。这些都在context里被定义为bean了。始自2001年1月21日。原创 2023-09-13 00:37:11 · 276 阅读 · 0 评论 -
Spring Boot会根据应用特征创建多个application context
Spring中ApplicationContext是有父子关系的,我们可以看到org.springframework.context.support.AbstractApplicationContext中有个private ApplicationContext parent数据成员,子容器可以访问父容器,父容器无法访问子容器。我们需要了解的是Spring是如何确定父子关系,如何实例化父子容器的。原创 2018-08-31 21:44:10 · 1272 阅读 · 1 评论 -
Spring Boot-4-BeanFactory的设计哲学
这个接口是继BeanFactory 2年多之后才出现,可见是对BeanFactory功能的补充,他设计了一个获取父BeanFactory的方法,也就是说他将BeanFactory分层次了,BeanFactory是有父子关系的。这个接口其实就是将获取多个bean的相关方法独立出来单独做一个接口,虽然这个接口里方法使用频率并不是特别高,但是却是必须的,所以独立出来一个单独的接口,继承BeanFactory,接口方法纵向拆分+继承,学到了没?始自 2003.11.26。始自 2001.4.13。原创 2021-06-04 16:51:42 · 357 阅读 · 0 评论 -
Spring Boot-5-DefaultListableBeanFactory
Spring IoC作用是管理Bean的生命周期并提供用户使用bean,所以我们有必要来看看Spring如何管理这些Bean的,前面我们提到IoC基本功能由BeanFactory系列类型实现,BeanFactory系列中就是DefaultListableBeanFactory这个类型完成的BeanFactory的基本功能。原创 2019-03-06 22:52:21 · 638 阅读 · 2 评论 -
Spring Boot-6-启动流程
Spring Boot的启动过程涉及甚广,要将Spring Boot的启动流程吃透,需要将Spring的所有功能都理解到位,因为启动的过程是为后续各个功能服务的。Spring Boot的主要功能是IoC容器,所以主要功能是扫描Bean,然后实例化Bean,在阅读整个源码的时候,一定要不停的追问这个和IoC容器有什么关系?原创 2020-09-13 17:00:05 · 625 阅读 · 1 评论 -
Spring Boot-7-SpringBoot特有监听器SpringApplicationRunListener
Spring Boot在启动的整个过程中会有一些逻辑需要处理,实现的方式的就是通过监听器。Spring设计监听器的方式比较简洁,这里的监听器和Servlet的ServletContextListener没有什么关系。org.springframework.boot.SpringApplicationRunListener始自Spring Boot 1.0.0org.springframework.boot.SpringApplication run方法的监听器。所有的SpringApplicationR原创 2022-07-09 17:18:37 · 3138 阅读 · 0 评论 -
Spring Boot-8-Spring通用应用监听器ApplicationListener
前面我们讲了spring boot在run()方法的启动流程中,通过SpringApplicationRunListeners来手动执行不同阶段时的监听器回调,那里调用到的监听器都是ApplicationListener类型,这些监听器做的事情能解答我们使用spring boot的很多现象。从经验上讲,有监听器就会有监听事件,不出所料,org.springframework.context.ApplicationEvent,就是作为监听器回调事件的参数。原创 2022-07-10 22:55:02 · 1748 阅读 · 0 评论 -
Spring Cloud-8-BootstrapApplicationListener有条件创建多个application context
在classpath中出现spring-cloud-context.jar包时,它在spring.factories文件里写了BootstrapApplicationListener,所以在构建SpringApplication对象时就扫描出这个监听器了。可以看到,ApplicationListener是定义在spring-context包中,属于经典上下文范畴,BootstrapApplicationListener是在spring-cloud-context中,属于cloud上下文范畴。原创 2022-07-23 17:45:09 · 3378 阅读 · 0 评论 -
Spring Boot-9-run方法之createApplicationContext()
本章内容基于Spring Boot 2.2.8ApplicationContext是Spring哲学中最强大的一个概念,他聚合了众多能力,如BeanFactory,他是用户能够接触Spring的通道,他的创建是不是应该足够引起重视?org.springframework.boot.SpringApplication#createApplicationContext()官方的说明是:这是一个策略方法用来创建ApplicationContext,在落到最后默认策略之前,他会接受一个显示设置的applica原创 2021-06-07 20:20:28 · 1174 阅读 · 0 评论 -
Spring Boot-10-run方法之AbstractApplicationContext#refresh()
本文源码基于Spring 5.2.7Spring中,容器的填充全靠org.springframework.context.support.AbstractApplicationContext#refresh()方法,这个方法的每一步都是值得分析的,这每一步都会分为一篇或多篇文章来解析,这里对这些步骤作一个整体说明。Spring的核心能力就是作为控制反转容器使用,通过名称可以看出,这个方法是用来刷新容器的,可想而知这个方法包含了Spring核心能力,包括AOP的处理过程都在这里。作为一个服务框架,Spri原创 2021-07-13 20:30:55 · 735 阅读 · 0 评论 -
Spring Boot之BeanFactoryPostProcessor
本章源码基于Spring Boot 2.2.8Spring容器刷新的过程中有一步是执行所有的BeanFactoryPostProcessor,对于用户来说,这是Spring提供的hook,对于Spring来说,这是提供给第三方的SPI。原创 2021-06-06 16:32:59 · 658 阅读 · 0 评论 -
Spring Boot-11-refresh()之invokeBeanFactoryPostProcessors()扫描bean
我们知道在org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors()方法中会有一个任务就是解析带@Configuration注解的类,最终这个任务对应的类型就是下面这个类org.springframework.context.annotation.ConfigurationClassParser,Spring 3.0就有了官方对这个类的解释是:解析一个Configurat原创 2021-04-25 21:03:53 · 445 阅读 · 0 评论 -
Spring Boot-BeanPostProcessor和BeanFactoryPostProcessor和InitializingBean
org.springframework.beans.factory.config.BeanPostProcessor和org.springframework.beans.factory.config.BeanFactoryPostProcessor都可以在一个被Spring管理的Bean的生命周期中进行自定义的一些处理,当然这个生命周期多半是被Spring管理的Bean实例化前后,这种操作也可以叫做钩子。实现BeanFactoryPostProcessor接口的方法将会在Bean实例化之前调用,实现Bean原创 2018-08-31 22:45:34 · 1095 阅读 · 1 评论 -
Spring Cloud配置中心原理
早期在开发应用时,程序中有一些可能变化的配置项,比如程序端口,连接IP,一些业务相关的参数等,这些参数会在程序运行过程中根据需求动态改动,此时,就会把这些参数写在一个文件中,让程序运行时去动态读取,这样就可以达到配置的效果,这个做法一直在使用,即时到了SpringBoot应用,依然也是提供了配置文件去读取。.........原创 2022-07-30 17:01:30 · 682 阅读 · 0 评论 -
Spring注解-1-SpringBoot是如何处理注解的
本文基于Spring 5.2.7这是个很大的话题,但是是个非常实在的话题,注解天天用,处处用,请问你知道他是怎么起作用的吗?如果你使用了注解,那么一定有代码在什么地方检索这个注解,并为这个注解的语义写了对应的逻辑。但是注解本身是没有任何行为的,他只是一个标记而已。所以注解是惰性的,看到注解时并没有行为,你需要找到注解对应的行为才能理解注解实际的作用。但是要找到一个注解对应的行为很难,因为很多注解都是些三方库提供的,要想找到每个注解对应的行为有如大海捞针,所有成事者一定是有志气的人。SpringBoot要原创 2021-05-27 20:59:17 · 1570 阅读 · 1 评论 -
Spring @Configuration
本文基于Spring 5.2.7org.springframework.context.annotation.Configuration始自 Spring 3.0标识一个声明一个或多个@Bean方法的的类,这个类会被Spring容器处理以生成对应的bean definitions和service requests。例子如下:Bootstrapping @Configuration classesVia AnnotationConfigApplicationContext@Configur原创 2021-06-14 10:25:01 · 1669 阅读 · 0 评论 -
Spring注解-2-@Configuration的解析之ConfigurationClassParser&ConfigurationClassPostProcessor
这个类是解析@Configuration注解的具体实现者。org.springframework.context.annotation.ConfigurationClassParser始自 Spring 3.0官方的解释是:解析一个Configuration定义的类,生成一批org.springframework.context.annotation.ConfigurationClass实例(解析单个Configuration类将会产生任意个数的ConfigurationClass实例,因为一个Con原创 2021-06-13 17:55:14 · 1117 阅读 · 0 评论 -
Spring Boot扫描bean之ConfigurationClassPostProcessor
本文基于Spring 5.2.7本文讲述的ConfigurationClassPostProcessor执行过程处于refresh()的invokeBeanFactoryPostProcessors()过程中。看源码务必搞清楚当前研究的是什么,处于Spring启动的哪个阶段。org.springframework.context.annotation.ConfigurationClassPostProcessor始自 Spring 3.0配置类处理器,来看看官方的说明:ConfigurationCl原创 2021-06-13 17:34:35 · 628 阅读 · 0 评论 -
Spring Boot扫描bean之ConfigurationClassPostProcessor之ConfigurationClassUtils
本文基于Spring 5.2.7在ConfigurationClassPostProcessor的解析当中,有很多关于Configuration的方法,我们没有作过多解释,这里将他们的源码做个解释。org.springframework.context.annotation.ConfigurationClassUtils#checkConfigurationClassCandidate()上面一大半的代码都是在获取org.springframework.core.type.AnnotationMet原创 2021-06-17 08:46:43 · 553 阅读 · 0 评论 -
4-Spring IoC之bean实例化(Spring Boot2)
我们知道Spring IoC容器就是管理bean的,对于一个IoC容器而言,想要管理bean,就要实例化bean,在Spring中如何实例化bean是我们必须掌握的,还是先给出几条规则1、bean的Scope定义了bean的生命周期和在上下文中的可见性,Spring框架中共定义了6种Scope:singleton,prototype,request,session,application,websocket,后面四个只能在web应用中才能够被使用到,默认Scope是singleton。使用方式@Scope(原创 2018-07-21 16:30:55 · 370 阅读 · 0 评论 -
3-Spring IoC容器之BeanDefinition和BeanPostProcessor分析(Spring Boot2)
Spring中有个接口org.springframework.beans.factory.config.BeanDefinition,从名字可以看出,他是对Bean的定义。我们知道Spring的核心就是IOC容器的管理,BeanDefinition就是对IoC中存储的Bean的一种定义,一种数据结构,一种访问接口。他下面的具体实现才是真正的细节,先建立这个概念,后面再详细分析各个实现以及相关使用的地方。先来几条规则树立下价值观:1、BeanDefinition是Spring IoC中对bean的详细定义,包原创 2018-08-13 00:15:17 · 833 阅读 · 0 评论 -
Spring不可获取的AbstractAutowireCapableBeanFactory
通过阅读源码可以知道AutowireCapableBeanFactory接口的实现分别由org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory和org.springframework.beans.factory.support.DefaultListableBeanFactory,具体由哪个实现上面有注释。2、实例化一个类型,并自动装配,这些属性对象都是Spring管理的,实例话的类不被Spring管理。原创 2018-08-21 18:07:33 · 5507 阅读 · 1 评论 -
SpringBoot错误处理
SpringBoot提供了一个/error的URI,当访问不存在地址或者处理出错时就会重定向到这个地址,返回用户一个预设的错误页面,如果你准备了404或者500等错误页面,放到合适的地方,那么SpringBoot也能找到这些页面并返回给前端。总的来说就是SpringBoot提供了一个默认的各种错误的页面。在springboot中是/error的handler是BasicErrorController这个类型,我们来看看这个类型的定义,@RequestMapping的参数比较复杂,意思就是优先使用server原创 2018-11-09 16:13:55 · 2584 阅读 · 1 评论 -
SpringBoot配置文件加载时机
今天遇到一个问题,项目中,数据库密码使用CyberArk管理,在yml配置文件中的配置是密码对应的一个key,所以需要在运行时合适的时机去通过接口获取密码并设置到SpringBoot中。问题是使用logback使用了DBAdapter,想把错误日志输入数据库中,方便持久化存储并查看。但是logback配置文件解析的时候,CyberArk对应的Bean还没加载进来,无法获取到真实的密码,导致SpringBoot因logback无法解析出DBAdapter而启动失败。......原创 2020-12-02 20:42:37 · 978 阅读 · 0 评论 -
spirng-mvc之ContextLoaderListener启动流程
Spring在Web应用中使用时需要配置一个启动入口,也即org.springframework.web.context.ContextLoaderListener监听器,下面我们来看看源码:initWebApplicationContext(...)方法是继承父类org.springframework.web.context.ContextLoader的方法,接着来看这个方法:我省略了不必要的日志等代码这里我们直接进入ContextLoader#createWebApplicationCont原创 2018-08-22 18:53:58 · 879 阅读 · 0 评论 -
Spring注入代理类|动态代理|Spring实例化bean流程
我们知道,Spring中如果配置切面,或者是使用声明式事务时,Spring会自动生成代理类,注入到IOC容器中,你相关的引用指向的就是代理的类型,而不是你定义的类型,正是这样,Spring才有了非侵入式的优点。那这是如何实现的呢?肯定是在实例化类型,注入到IOC容器的时候会生成代理实例,我们就从这里入手看看Spring实例化bean的流程。...原创 2018-08-14 22:14:36 · 5503 阅读 · 0 评论 -
Spring事务-处理流程
这里讲述的是以@Transactional注解方式配置Spring事务的原理。我们启用事务注解的时候,往往配置如下:在Spring中,annotation-driven是用来开启注解支持的,前面添加名字空间,如tx:或者mvc:之类的,后面可以选填一些属性,这是我们需要了解的,具体属性值情况如下:1、transaction-manager:指定到现有的PlatformTransactionManager bean的引用,通知会使用该引用。默认值为"transactionManager" 2、mode原创 2018-08-12 23:59:13 · 990 阅读 · 1 评论 -
Spring的BeanUtils原理
在Spring内部,很多地方都不使用new关键字来创建对象,而是使用BeanUtils工具来实例化一个类型,来看看其中一个方法:其中clazz.getDeclaredConstructor()获取到无参构造方法,然后来看看instantiateClass()方法:然后直接调用ctor.newInstance(args)生成对象。所以粗略看来BeanUtils.instantiateClass(Class clazz)的功能就是调用通过无参构造函数实例化类型。...原创 2018-08-22 18:50:54 · 2498 阅读 · 0 评论 -
Spring之单例Bean的创建
本文基于Spring 5.2.7Spring最基础的功能是IoC容器,能够容纳bean,就需要实例化bean并放入容器内。在Spring中,bean是有范围属性的,这个范围是时间、空间维度的,叫做scope,一个bean如果存在与应用整个生命期内,就是一个shared bean instance,他的scope值是singleton,如果一个bean只存在于应用生命器的一段时间内,是一个prototype bean instance,他的scope值就是prototype。这里的prototype意思和设原创 2021-07-18 22:17:26 · 3351 阅读 · 2 评论