首页
学习
活动
专区
圈层
工具
发布

实现一个简单的 Spring Bean 容器

本文将带领读者实现一个简单的 Spring Bean 容器,用于定义、存储和获取 Bean对象。...另外,实现一个简单的 Spring Bean 容器,还需要完成 Bean 对象的定义、注册和获取 3 个基本步骤,如图 1-1 所示。...当 Spring Bean 容器初始化 Bean 对象后,Bean 对象就可以被直接获取。按照上述设计过程,我们来实现一个简单的 Spring Bean 容器。...本文总结 关于 Spring Bean 容器的一个简单实现已经完成了,这部分代码相对简单,读者稍加尝试就可以实现这部分内容。...所以,如果你真地想了解Spring 这个源码级复杂框架的设计和实现精髓,就应该像开发一个项目一样,从零写一遍。只有你写了这个项目,才能知道具体细节是如何处理的,各类设计是如何实现的。

37550

实现一个简单的 Spring Bean 容器

本文将带领读者实现一个简单的 Spring Bean 容器,用于定义、存储和获取 Bean对象。...另外,实现一个简单的 Spring Bean 容器,还需要完成 Bean 对象的定义、注册和获取 3 个基本步骤,如图 1-1 所示。...当 Spring Bean 容器初始化 Bean 对象后,Bean 对象就可以被直接获取。按照上述设计过程,我们来实现一个简单的 Spring Bean 容器。...本文总结 关于 Spring Bean 容器的一个简单实现已经完成了,这部分代码相对简单,读者稍加尝试就可以实现这部分内容。...所以,如果你真地想了解Spring 这个源码级复杂框架的设计和实现精髓,就应该像开发一个项目一样,从零写一遍。只有你写了这个项目,才能知道具体细节是如何处理的,各类设计是如何实现的。

38220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    03 Spring框架 bean的属性以及bean前处理和bean后处理

    ,那么Spring就会新建一个bean实例然后返回给程序。...前处理,什么又是bean后处理: Spring提供了一个接口,我们可以定义一个类,实现这个接口,这个接口提供了两个方法 postProcessBeforeInitialization postProcessAfterInitialization...分别会在对象的创建之前和创建之后调用, 实现这个接口可以帮助我们在一些情况下,在一个对象创建的前后添加一些日志和预处理,或者关闭处理。...bean;//这里的返回必须为bean } } 上面的这个类实现了BeanPostProcessor接口并提供了bean前方法和bean后方法,两个方法的参数都为我们想要生成的对象的引用。...上面就是这个实现类的具体使用方法(省略了具体的bean对象产生配置) 本篇文章就介绍到这里。

    1K60

    Spring Bean的生命周期接口

    前言在Spring框架中,Bean的生命周期由一些特定的接口和方法来管理。一个典型的Spring Bean的生命周期包括实例化、属性设置、初始化和销毁等阶段。...说明首先,让我们来看一下在Spring中管理Bean生命周期的接口: InitializingBean:该接口定义了一个方法 afterPropertiesSet(),在Bean的所有属性被设置之后调用...DisposableBean:该接口定义了一个方法 destroy(),在Bean被销毁之前调用。您可以在这个方法中执行一些资源释放的操作。...除了实现上述接口外,您还可以使用注解来管理Bean的生命周期: @PostConstruct:使用该注解标记一个方法,在Bean的所有属性被设置之后立即调用,相当于InitializingBean接口中的...@PreDestroy:使用该注解标记一个方法,在Bean被销毁之前调用,相当于DisposableBean接口中的 destroy() 方法。

    31600

    Spring|第二章:实现一个简单的Bean容器

    通过手动实现一个Bean容器,我们将深入了解Spring依赖注入的原理和实现方式。 实现一个简单的Bean容器 我们将使用Java编写一个简化版的Bean容器,实现对象的创建和依赖注入。...以下是我们的实现步骤: 步骤1:定义Bean类 首先,我们需要定义一个简单的Bean类,用于演示容器的功能。...步骤2:实现Bean容器 接下来,我们将实现一个简单的Bean容器类BeanContainer,用于管理对象的创建和依赖注入。...,这意味着依赖注入成功并且对象之间的依赖关系正确设置。 总结 通过实现一个简单的Bean容器,我们深入了解了Spring依赖注入的原理和实现方式。...手动实现一个Bean容器有助于我们理解Spring框架的内部工作原理,并为我们提供了定制和扩展框架的能力。

    43330

    Spring 实现自定义 bean 的扩展

    Spring mvc 提供了扩展 xml 的机制,用来编写自定义的 xml bean ,例如 dubbo 框架,就利用这个机制实现了好多的 dubbo bean,比如 实现一个自定义功能,用现有的 Spring 配置项也可以实现,但可能要配置的内容较多,而且还有可能要加入代码辅助。...实现自定义扩展的步骤 本例只做简单示范,功能简单,即实现一个可配置参数的 Hacker bean,然后提供一个toString() 方法,输入参数信息。...4、实现 BeanDefinitionParser 类,这个类的作用简单来说就是将第一步实现的类和 Spring xml中生命的 bean 做关联,实现属性的注入,来看代码: package kite.lab.spring.config...方法可以获取 配置的参数值,第二个参数 ParserContext ,可以理解为 Spring 提供的接口对象,通过它实现注册 bean 的注入。

    1.2K80

    Spring 一个接口多个实现类怎么注入

    先写一个场景,举例说明: 1、接口:IAnimal public Interface IAnimal{ ...... } 2、实现类:DogImpl ,实现了IAnimal接口。...“动物”的接口 IAnimal, DogImpl类实现了接口 IAnimal, 且该接口只有 DogImpl这一个实现类,那么在引用实现类的时候,我们使用的是实现类的接口(像上面程序展示的那样)。...Spring会按 byType的方式寻找接口的实现类,将其注入。...假如有另一个实现类 CatImpl 也实现了接口 IAnimal, 这时候再按上面的方式去引用, 在同时存在两个实现类的情况下,会出现什么情况呢?      答:会报错。 ...private IAnimal dogImpl; ...... } 总结: 1、@Autowired 是通过 byType 的方式去注入的, 使用该注解,要求接口只能有一个实现类。

    3K20

    spring(5) - Bean实例化中,对循环依赖的处理

    背景知识 (1) spring(3) - springboot启动过程 (2) spring(4) - spring Bean创建并注册到容器 2....Bean创建 通过 背景知识,我们知道,spring在创建Bean的时候,分三步,先创建bean,然后注册到容器中,之后进行属性装配,在进行初始化 2.1 AbstractAutowireCapableBeanFactory...点击其中一个属性,我们看下属性的声明 ,发现这几个属性都属于父类 DefaultSingletonBeanRegistry ,那就明白啦 , 这个类就是处理spring Bean 容器处理缓存的类,如下...,其职责就是包装一个bean,有回调逻辑,所以它的作用非常清晰,并且只能处于第三层。...3 应用三层缓存对循环依赖的处理举例 如果 A,B 两个类互相依赖,且需要实例化,当只有一层缓存 singletonObjects 的时候,A 实例化调用B,B实例化调用A,就无法结束了; 此时加一层缓存

    1K20

    Spring注解@Import实现多模块中Bean的导入

    默认情况下Spring Boot应用只会扫描main方法所在的包路径下的Bean和通过spring.factories进行注册发现自动装配到Spring IoC中去。...像下面这个Maven项目中,如果Spring Boot的Main类在cn.felord.yaml包下的话cn.felord.common包的Spring Bean是无法被扫描注册到Spring IoC容器中的...Maven多目录项目 今天我们将借助于@Import注解和相关的一些接口来实现特定路径下的Spring Bean的导入。 2. @Import @Import注解主要提供配置类导入的功能。...(){ return () -> "@Import"; } } 以上是我们在cn.felord.common下实现的一个配置,目的是将FooService的实现注册为Spring...*/ String[] selectImports(AnnotationMetadata importingClassMetadata); /** * 返回一个谓词接口,该接口制定了一个对类全限定名的排除规则来过滤一些候选的导入类

    2.7K10

    在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

    第 2 章:小试牛刀,实现一个简单的Bean容器 第 3 章:初显身手,运用设计模式,实现 Bean 的定义、注册、获取 第 4 章:崭露头角,基于Cglib实现含构造函数的类实例化策略 第 5 章:一鸣惊人...另外是填充属性信息还包括了 Bean 的对象类型,也就是需要再定义一个 BeanReference,里面其实就是一个简单的 Bean 名称,在具体的实例化操作时进行递归创建和填充,与 Spring 源码实现一样...Spring 源码中 BeanReference 是一个接口 四、实现 1....每一个章节的功能点我们都在循序渐进的实现,这样可以让新人更好的接受关于 Spring 中的设计思路。尤其是在一些已经开发好的类上,怎么扩充新的功能时候的设计更为重要。...另外在框架实现的过程中所有的类名都会参考 Spring 源码,以及相应的设计实现步骤也是与 Spring 源码中对应,只不过会简化一些流程,但你可以拿相同的类名,去搜到每一个功能在 Spring 源码中的实现

    4.9K20

    Spring Ioc源码分析 之 Bean的加载(六):循环依赖处理

    实例化 bean 后置处理 单例模式的循环依赖处理 属性填充 初始化 bean 实例对象 依赖检查 注册 DisposableBean 本章我们主要分析第4步: 一、循环依赖是什么?...Spring中的循环依赖,其实就是一个死循环的过程,在初始化 A 的时候发现依赖了 B,这时就会去初始化 B,然后又发现 B 依赖 C,跑去初始化 C,初始化 C 的时候发现依赖了 A,则又会去初始化...为什么 Spring 不处理 prototype bean 呢?其实如果理解 Spring 是如何解决 singleton bean 的循环依赖就明白了。...小结: 一级缓存里面是完整的Bean,是当一个Bean完全创建后才put 三级缓存是不完整的BeanFactory,是当一个Bean在new之后就put(没有属性填充、初始化) 二级缓存是对三级缓存的易用性处理...这样,一旦下一个 bean 创建的时候需要依赖 bean ,则从三级缓存中获取。

    86720

    慎用ApplicationContextAware的实现类来操作Spring容器的bean

    禁止在项目中在Spring容器管理类的静态代码块里通过调用ApplicationContextAware的实现类来操作Spring容器的bean!!!...Service、@Component、@Configuration等) 将其扫描进Spring容器,并存储每个bean的信息为BeanDefinition,并且里面维护一个集合list,负责存每个扫描进容器的...这里面TestBeanA是以@Configuration+@Bean注入的,所以顺序是在最后。...当你想定义一个类,比如工具类,它不交给Spring来管理,而你又想去获取Spring容器管理的类时候,此时ApplicationContextAware就能派上用场了。...,一个简单、方便的文件存储方案 深入浅出 Nginx 实战与架构原理 技术专家带你彻底掌握线程池 基于GF的后台管理系统,完善的权限用户管理,致力于快速高效开发

    78010

    spring4.1.8扩展实战之五:改变bean的定义(BeanFactoryPostProcessor接口)

    本章我们继续实战spring的扩展能力,通过自定义BeanFactoryPostProcessor接口的实现类,来对bean实例做一些控制; 原文地址:https://blog.csdn.net/boling_cavalry...接口的bean,注意这里已将面实现了BeanDefinitionRegistryPostProcessor接口的bean给剔除了,将这些bean分为三类:实现了PriorityOrdered接口的放入priorityOrderedPostProcessors...此时的spring容器还没有开始实例化bean,因此自定义的BeanFactoryPostProcessor实现类不要做与bean实例有关的操作,而是做一些与bean定义有关的操作,例如修改某些字段的值...,这样后面实例化的bean的就会有相应的改变; 实战BeanFactoryPostProcessor接口的实现类 本次实战的内容是创建一个springboot工程,在里面自定义一个BeanFactoryPostProcessor...创建一个BeanFactoryPostProcessor接口的实现类CustomizeBeanFactoryPostProcessor,并且用注解Component将其定义为spring环境中的bean

    74720

    深度解析 Spring 源码:揭秘 AbstractAutowireCapableBeanFactory 的 Bean 生命周期处理

    一、AbstractAutowireCapableBeanFactory 概述AbstractAutowireCapableBeanFactory是Spring框架中的一个重要类,主要负责实现Bean的自动装配功能...**面向接口编程:** Spring 框架鼓励面向接口编程,而不是面向实现编程。...2.3.2 invokeAwareMethods()确保了实现了Aware接口的Bean,可以在其生命周期中获得对Spring容器的相关信息的访问。...这两个接口允许在Spring容器实例化和配置Bean的不同阶段介入并添加自定义逻辑。例如,可以在Bean初始化前后执行额外的操作,或者在Bean实例化前修改Bean的定义。...()); }}3.2 在项目中如何充分利用 Bean 生命周期处理机制**案例**:有一个简单的Spring Boot项目,其中包含一个名为UserService的服务类,以及一个名为CustomBean

    35910

    聊聊Spring的bean覆盖(存在同名nameid问题),介绍Spring名称生成策略接口BeanNameGenerator【享学Spring】

    可你是否曾想过:既然它是Map,那万一我们写的@Bean的beanName重名了怎么办呢?Spring框架是怎么来处理这个事的呢?...Spring对它的生成有什么规律可循呢?那么接下来就就研究下这个策略:名称生成策略 BeanNameGenerator 为bean定义生成bean名称的策略接口。...处理完成(所以这个生成器肯定能保证Bean定义的唯一性,不会出现Bean name覆盖问题) ---- 需要注意的是,DefaultBeanNameGenerator在Spring中已经几乎处于一个被弃用了的状态...定义是最先被注册的~ ---- 上面case都是描绘的在同一个Spring容器的情况下出现同名的情况,那么若在不同的容器内出现同名Bean呢?...) 我们知道注册Bean定义的方法是BeanDefinitionRegistry.registerBeanDefinition(),此接口方法的唯一真正实现就在DefaultListableBeanFactory

    15.7K108

    Spring源码解析(二):bean容器的创建、注册默认后置处理器、bean定义扫描类

    一、Spring源码基础组件 阅读源码时候,接口与类过多,可以对照这里查看对应的关系 1、bean定义接口体系 2、bean工厂接口体系 3、ApplicationContext上下文体系 二、AnnotationConfigApplicationContext...的父类是GenericApplicationContext 调用当前类的无参构造,先会调用父类的无参构造,先看下父类无参构造做的事情 这个beanFactory就是spring容器的核心实现类 DefaultListableBeanFactory...)); } // 3.4.spring注册支持jpa注解的beanFactory后置处理器 if (jpaPresent && !...的名字,有则直接返回 // 没有则根据短名构造一个(如果写的名字第1、2个字符是大写则直接返回,否则直接将第一个字符转成小写返回) String beanName = this.beanNameGenerator.generateBeanName...bean和解析注解的后置处理器 创建根据包路径扫描bean定义的类

    72221

    Spring中的Bean工厂后置处理器:BeanDefinition的魔术师

    当我们深入理解Spring容器的启动机制时,会发现它实际上是一个精心设计的模板方法(Template Method)模式实现,而BeanFactoryPostProcessor正是这个模式中预留的关键扩展点之一...容器现在会优先执行实现了PriorityOrdered接口的处理器,然后是实现了Ordered接口的处理器,最后才是普通的处理器。...该方法会: 首先处理所有实现了PriorityOrdered接口的BeanFactoryPostProcessor 然后处理实现了Ordered接口的处理器 最后处理没有实现任何排序接口的普通处理器 这种分层处理机制确保了关键的后置处理器...例如通过@Bean方法显式声明一个BeanPostProcessor时,需要特别注意该处理器本身不会被自己处理(即不会对自身应用后置处理逻辑)。...在2025年的Spring生态中,我们看到了几个值得关注的发展趋势: 编译时处理增强:部分原本在运行时执行的BeanFactoryPostProcessor逻辑正在向编译时迁移,特别是与配置处理相关的部分

    30310

    你能说说 Spring 中,接口的bean是如何注入的吗

    你能说说 Spring 中,接口的bean是如何注入的吗? 问: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?...bean,只注入了实现类serviceImpl的bean,接口只是用来接收的。...再来说Controller获取实例的过程:使用@Autowired,程序在spring的容器中查找类型是TestService的bean,刚好找到有且只有一个此类型的bean,即testServiceImpl...问: 如果一个接口有多个实现类时,通过注解获取实例时怎么知道应该获取的是哪一个实现类serviceImpl呢?...答: 直接获取实现类serviceImpl的bean也是可以的; 至于加一层接口的原因:一是AOP程序设置思想指导,给别人调用的接口,调用者只想知道方法和功能,而对于这个方法内部逻辑怎么实现的并不关心

    34210

    《Spring 手撸专栏》第 2 章:小试牛刀,实现一个简单的Bean容器!

    另外一个简单的 Spring Bean 容器实现,还需 Bean 的定义、注册、获取三个基本步骤,简化设计如下; ?...但目前我们初步实现会更加简单的处理,只定义一个 Object 类型用于存放对象。...获取:最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。 接下来我们就按照这个设计,做一个简单的 Spring Bean 容器代码实现。...图 2-2 Spring Bean 容器的整个实现内容非常简单,也仅仅是包括了一个简单的 BeanFactory 和 BeanDefinition,这里的类名称是与 Spring 源码中一致,只不过现在的类实现会相对来说更简化一些...六、总结 整篇关于 Spring Bean 容器的一个雏形就已经实现完成了,相对来说这部分代码并不会难住任何人,只要你稍加尝试就可以接受这部分内容的实现。

    42131
    领券