Spring
文章平均质量分 92
Jeremy_1022
主营Java但不限于,热爱研究新鲜事物、喜欢记录点点
展开
-
Spring与设计模式总览
简单梳理了下Spring中的设计模式,后续会根据项目内容具体实例给出实际工作中的运用原创 2024-07-16 19:27:46 · 1560 阅读 · 2 评论 -
Spring与设计模式实战之策略模式
策略模式是一种行为型设计模式,它允许定义一系列算法,并将每个算法封装起来,使它们可以互换。这种模式让算法的变化独立于使用算法的客户。在Java中,策略模式通常通过接口和它们的实现类来实现。在Spring框架中,是一个非常核心的概念。它代表Spring IoC容器,负责实例化、配置和管理Beans。通过实现接口,Spring Bean可以访问Spring的,从而获取其他Beans或上下文信息。我们首先定义一个自定义注解,用于标注具体的策略类。这个注解可以在运行时通过反射机制进行处理。原创 2024-07-16 18:57:28 · 1859 阅读 · 0 评论 -
Spring常见问题一:IOC和DI
控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是现代软件开发中的关键设计原则。IoC通过将对象的创建和依赖管理交给容器,实现模块解耦和代码可维护性。DI作为IoC的实现方式,通过构造函数、Setter方法和接口注入增强模块化和代码可读性。依赖关系如果处理不当,会导致高耦合、代码重用性低等问题。Spring框架通过IoC容器支持依赖注入,管理对象生命周期和依赖关系,提供多种注入方式、配置方式和作用域管理,使代码更加模块化、可维护和易于测原创 2024-07-14 19:12:40 · 698 阅读 · 0 评论 -
Spring源码注解篇一:注解的本质与工作原理
Spring注解是Java中的一种元数据机制,用于简化配置和管理Bean、依赖注入、事务等功能。注解本质上是Java中的接口,通过编译时、类加载时或运行时的处理实现特定功能。Spring通过类路径扫描、反射和动态代理等机制处理注解,如`@Component`用于标识Spring Bean,`@Autowired`用于自动注入依赖,`@Transactional`用于声明事务。元注解如`@Retention`、`@Target`、`@Inherited`等用于定义其他注解的行为和范围。理解注解的工作原理有助于原创 2024-07-14 19:26:32 · 846 阅读 · 0 评论 -
Spring源码注解篇二:手写@Component注解
今天主要是通过模拟Spring的@Component注解,来学习Spring中的注解原创 2024-07-15 22:39:43 · 1001 阅读 · 0 评论 -
Spring源码注解篇三:深入理解@Component注解
Spring框架作为Java开发中不可或缺的一部分,其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中@Component及其派生注解的源码实现,分析Spring如何通过类路径扫描(Classpath Scanning)和BeanDefinition的封装来管理Bean的生命周期和依赖。原创 2024-07-15 23:10:55 · 899 阅读 · 0 评论 -
专题一: Spring生态初探
切面可以使用注解或 XML 定义。@Aspect@ComponentSpring 框架是企业级 Java 开发的一个多功能且全面的框架。通过理解其核心概念和模块,开发人员可以利用其强大的功能构建健壮、可扩展且易维护的应用程序。原创 2024-06-30 20:51:58 · 119254 阅读 · 0 评论 -
专题二:Spring源码编译
Spring 源码配置:1、下载源码 2、配置Gradle 3、源码配置文件修改原创 2024-06-29 21:48:53 · 119281 阅读 · 0 评论 -
专题三:Spring源码中新建module
前面我们构建好了Spring源码,接下来肯定迫不及待来调试啦,来一起看看大名鼎鼎。原创 2024-06-30 21:57:48 · 447 阅读 · 0 评论 -
专题四:Spring源码初始化环境与BeanFactory
上文我们通过new ClassPathXmlApplicationContext("applicationContext.xml");这段代码看了下Spring是如何将Xml里面内容注入到Java对象中,并通过context.getBean("jmUser");方式获得了一个对象实例,而避开使用new 来耦合。今天我们就来看看Spring是如何做到的呢?上图是AbstractApplicationContext的类图,dedug跟踪这段代码。原创 2024-06-30 23:44:23 · 118367 阅读 · 0 评论 -
专题五:Spring源码之初始化容器上下文
目前我们代码进程如下图所示:下一节我们正式进入初始化容器,看看众所周知的Bean Factory到底怎么来的。原创 2024-07-01 21:18:41 · 119643 阅读 · 0 评论 -
专题六:Spring源码之初始化容器BeanFactory
上一篇咱们通过一个例子介绍初始化容器上下文相关内容,并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点,和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。原创 2024-07-01 22:36:18 · 119147 阅读 · 0 评论 -
专题七:Spring源码之BeanDefinition
上一篇我们通过refresh方法中的第二个核心方法obtainBeanFactory,通过createBeanFacotry创建容Spring的初级容器,并定义了容器的两个核心参数是否允许循环引用和覆盖。现在容器有了,我们来看看容器里的第一个重要成员BeanDefinition。进入loadBeanDefinitions方法。原创 2024-07-02 20:57:24 · 118279 阅读 · 0 评论 -
Spring源码八:容器扩展一
上一篇我们结束了refresh方法中的obtainBeanFactory方法,得到了一个初级容器BeanFactory实例对象,并对该对象进行了最基本的设置(是否支持覆盖与循环引用)。并设置了最基础的成员属性beanDefinitionMap(存放BeanDefiniton的容器),这一章开始我们来逐步看下Spring是如何扩展这个基础的容器,是他拥有更高级的功能。咱们继续回到Spring的refresh方法如下:prepareBeanFactory方法总览在Spring框架中, 方法是原创 2024-07-02 23:17:09 · 118970 阅读 · 0 评论 -
Spring源码九:BeanFactoryPostProcessor
*** 自定义Bean的后置处理器*/@OverrideSystem.out.println("自定义Bean的后置处理器,重写postProcessBeanFactory方法");// 获取容器中的对象// 修改属性Spring已经提供了空实现的postProcessorBeanFactory方法,为啥还要单独搞一个接口来定一个这个方法呢?Spring提供接口,而不是在refresh方法中直接进行beanFactory修改,主要是为了提高代码的解耦性、可维护性和扩展性。原创 2024-07-03 22:01:52 · 1097 阅读 · 0 评论 -
Spring源码十:BeanPostProcess
在Bean初始化之前被调用。这通常指的是在Bean的或者实现了接口的方法之前。:在Bean初始化之后被调用。这些方法的主要作用是允许开发者在Bean的初始化过程中进行定制化处理,这种处理可以是对Bean属性的修改、添加日志、检查标记接口或对Bean进行代理等操作。此步骤从BeanFactory中获取所有实现了BeanPostProcessor接口的Bean名称。这是为了后续将这些Bean按照不同的规则进行处理和注册。原创 2024-07-04 20:22:37 · 1131 阅读 · 1 评论 -
Spring源码十一:事件驱动
首先,定义一个自定义事件类,继承自// 处理事件逻辑接着,创建一个监听器,实现@Component@Override// 处理事件通过以上步骤,我们实现了基于Spring内部广播器发布和处理自定义事件的过程,并深入理解了在事件发布中的关键作用。广播器负责管理和调用注册的监听器,从而实现事件驱动的编程模型。原创 2024-07-05 19:38:26 · 821 阅读 · 0 评论 -
Spring源码十二:事件发布源码跟踪
上一篇我们在Spring源码十一:事件驱动中,介绍了spring refresh方法的initMessageSource方法与initApplicationEventMulticaster方法,举了一个简单的例子进行简单的使用的Spring为我们提供的事件驱动发布的示例。这一篇我们将继续跟踪源码,看看Spring事件是如何发布的。今天我们先从refresh方法中暂时抽离出来,接着上一篇我们给的示例往下看:我们以MyselfClassPathXmlApplicationContext(继承ClassPa原创 2024-07-06 08:34:35 · 777 阅读 · 0 评论 -
Spring源码十三:非懒加载单例Bean
今天我们看下Spring是如何初始化非延迟加载单例的Bean首先我先回到refresh方法中:我们将目光回到refresh方法中的,finishBeanFactoryInitialization方法:上述代码注释很清晰,finishBeanFactoryInitialization方法其实只是做了一些比较基础的初始化工作,核心还得看下preInstantiateSingletons方法。上述内容,首先是遍历所有已经注册到Spring容器中的BeanDefiniton对象(在obtainBe原创 2024-07-06 11:24:49 · 376 阅读 · 0 评论 -
Spring源码十四:Spring生命周期
上一篇我们在中看到了Spring会在refresh方法中去调用我们的finishBeanFactoryInitialization方法去实例化,所有非懒加载器单例的bean。并实例化后的实例放到单例缓存中。到此我们refresh方法已经接近尾声。Spring的生命周期。原创 2024-07-06 17:36:21 · 571 阅读 · 0 评论 -
Spring源码十五:Bean的加载
Spring框架中Bean创建与获取的核心逻辑,实现了复杂的Bean生命周期管理。通过单例缓存、合并Bean定义、处理依赖关系以及类型转换等步骤,确保了Bean实例的正确创建与获取。此流程通过细致的检查与处理,避免了循环依赖,并支持多种作用域的Bean管理,为应用提供了灵活且可靠的Bean管理机制。原创 2024-07-07 04:17:38 · 20433 阅读 · 0 评论 -
Spring源码十六:Bean名称转化
初步分析了bean的名称解析并转换相关的代码逻辑,从下一篇开始,我们就要开始bean加载的核心逻辑分析了。原创 2024-07-07 12:54:51 · 1066 阅读 · 0 评论 -
Spring源码十七:Bean实例化入口探索
本篇咱们通过doGetBean方法一步一步进入,先是跳过了三级缓存获取单例bean方法,然后着重看了了原型Bean创建前的校验、父容器创建bean的场景,以及Spring容器在创建Bean实例时所遵循的步骤和逻辑。下一篇我们将探索Spring是如何来实例化bean。原创 2024-07-07 21:31:35 · 918 阅读 · 0 评论 -
Spring源码十八:Bean实例化流程一
Spring在实例化前的两重要准备工作,获取我们前面注册好的BeanDefinition,将GenericBeanDefinition封装为RootBeanDefinition如果Bean Definition只存在父容器中,还会进行合并操作,然后做了严谨的异常判断处理,如果bean配置了依赖的bean的名称,还会检查下配置的依赖,是否已经处于bean依赖的引用链上了,如果没有处于bean依赖引用链上,就会提前来实例化bean依赖的那些bean。最后找到实例化的入口。原创 2024-07-08 02:52:05 · 936 阅读 · 0 评论 -
Spring源码十九:Bean实例化流程二
上一篇我们在中,主要讨论了Spring在实例化前的两重要准备工作,1、获取我们前面注册好的BeanDefinition,将GenericBeanDefinition封装为RootBeanDefinition如果Bean Definition只存在父容器中,还会进行合并操作,然后做了严谨的异常判断处理。2、如果bean配置了依赖的bean的名称,还会检查下配置的依赖,是否已经处于bean依赖的引用链上了,如果没有处于bean依赖引用链上,就会提前来实例化bean依赖的那些bean。最后找到实例化的入口。原创 2024-07-08 17:43:58 · 1061 阅读 · 0 评论 -
Spring源码二十:Bean实例化流程三
简单的回忆了之前的内容,我们发现还有一个很重要的点我们没有说到那就是怎么通过简单工厂来创建实例对象的,这一篇咱们详细讨论一下:因为lockup-method属性与repliace-methon配置属性,现在基本上没有使用场景,而resolveBeanClass与preprareMethodOverrides是为了是实现这个两个方法而生的,所以我们直接来看 resolveBeforeInstantiation方法。 是 的一个子接口,提供了以下方法,用于在 Bean 实例化的不同阶段进行干预:这原创 2024-07-09 21:53:00 · 1269 阅读 · 0 评论 -
Spring源码二十一:Bean实例化流程四
今天开始进入doCreateBean中一探究竟:首先回去BeanFactory的缓存中获取Bean Wrapper对象,默认没有所以肯定会走到createBeanInstance方法中,我们进入方法内部看下。上述代码注释基本上都解释了一遍,咱们简单总结下:类解析和校验:首先解析bean的类,并进行访问权限校验。这一步确保了后续操作的前提条件都已经满足。实例供应商检查:如果定义了实例供应商,则通过供应商创建实例。这种方式提供了高度的灵活性,使得实例的创建可以由外部逻辑控制。一般不做扩展,故不做具体原创 2024-07-10 19:23:08 · 1337 阅读 · 0 评论 -
Spring源码二十二:Bean实例化流程五
bean在实例化之前会推测构造方法,然后根据构造方法的类型来通过反射机制来完成具体的实例化。到这里咱们终于看到了实例化的bean,接下来Spring会对这个刚刚实例化好的bean做些什么呢?原创 2024-07-11 16:56:49 · 710 阅读 · 0 评论 -
Spring源码二十三:Bean实例化流程六
上一篇咱们主要了解到bean在实例化之前会推测构造方法,然后根据构造方法的类型来通过反射机制来完成具体的实例化。到这里咱们终于看到了实例化的bean,接下来Spring会对这个刚刚实例化好的bean做些什么呢?原创 2024-07-12 19:58:26 · 669 阅读 · 0 评论 -
Spring源码二十四:Bean流程探讨
在Spring中,Bean是应用的基本组成部分,Spring容器负责创建、配置和管理Bean的生命周期。Spring Bean流程是Spring框架的核心之一,它通过灵活的配置和强大的依赖注入机制,简化了Java应用的开发。在Spring中,BeanDefinition是对Bean的抽象描述,包含了Bean的各种配置信息,如类类型、作用域、构造函数参数、属性依赖等。在这个示例中,A和B相互依赖,但通过Spring的三级缓存机制,能够正确处理循环依赖,确保两个Bean都能成功初始化。原创 2024-07-12 20:09:30 · 561 阅读 · 0 评论