spring容器创建bean过程中使用到的几个factory

前述

spring我们可以理解为一个帮我们管理bean的容器,使用spring框架之前创建bean都是通过new的方式,使用spring框架之后, 我们只需要告诉spring框架我们有那些bean,它会帮我们管理这些bean,在程序启动的时候帮我们创建好,放到一个容器中,随用随取,并且维护bean整体的生命周期,它有两大特性AOP(面向切面编程)和IOC(控制反转),spring也是一个基础框架,再次基础之上还有springboot框架和springcloud框架,这些框架都是以spring框架为基础的,并在此基础上进行二次开发。

IOC:之前由我们自己来new对象,现在由spring帮我们创建对象并且来管理和控制这些对象,这就是控制反转。

AOP:一些用于跟业务逻辑无关的代码,我们可以通过aop的形式来实现,比如日志打印等,在不影响业务逻辑的情况下对方法进行增强

上述提到spring框架可以帮我们管理bean,所以spring框架在启动过程中会去创建很多bean,然后交给IOC容器,创建的过程中涉及到几个比较容易混淆的factory如下:BeanFactory,FactoryBean,ObjectFactory,下面我们来分析一下这几个Factory的区别点。

BeanFactory

BeanFactory:是一个接口,是一个bean的工厂,能够创建bean(按照bean的生命周期来创建Spring中大部分的bean实例),并提供了获取bean实例的方法。
在这里插入图片描述
准确来说它并不是单纯指spring框架中的一个接口,而是bean对象创建的整体流程,spring中bean的生命周期是一个完整的标准化流程,相对比较麻烦, 所以spring框架把这些处理bean的方法抽象出了一个接口,用它来管理和创建bean。

拓展:spring容器启动时,会创建一个BeanFactory的实例,BeanFactory的创建和初始化过程涉及多个阶段,这也是Spring IOC容器的基本组成部分,负责管理对象的定义和依赖关系。随后,BeanFactory会进一步转变为ApplicationContext,它是容器的一个更高级别的扩展,提供了更多的功能,例如国际化支持、事件传播等。在Spring中,BeanFactory的几个常见实现类包括:

  • XmlBeanFactory:一个简单的BeanFactory实现,它可以从XML文件中加载Bean定义。

  • ApplicationContext:继承自BeanFactory接口,提供了更多高级特性,如国际化、资源访问(如URL和文件系统)、事件传播等。

  • ClassPathXmlApplicationContext:从类路径下加载配置文件的ApplicationContext实现。

  • FileSystemXmlApplicationContext:从文件系统中加载配置文件的ApplicationContext实现。

  • AnnotationConfigApplicationContext:从注解中加载配置的ApplicationContext实现。

FactoryBean

FactoryBean:是一个接口,通过实现这个接口,能够自定义创建bean实例,不必按照bean的生命周期来创建bean。
在这里插入图片描述
FactoryBean是一种设计模式,它允许开发人员使用工厂方法来创建和管理bean对象,也是用来创建bean对象的,在这个接口中提供了三个方法,在Spring框架中,FactoryBean是一个特殊的bean,它可以用来创建其他bean(Diy Bean),当我们需要根据一定条件创建不同类型的bean时,使用FactoryBean可以更加灵活地进行配置和管理。

通过实现FactoryBean接口并覆盖getObject()方法,我们可以在Spring容器启动时自定义创建bean的过程,并返回所需的bean对象, 同时,FactoryBean还支持对bean的生命周期进行管理,包括初始化和销毁操作。

ObjectFactory

ObjectFactory:是一个函数式接口,用于Spring三级缓存(singletonFactories),bean实例化以后就会加入三级缓存,三级缓存是以bean name未key, 函数式接口为value,在bean完成实例化(还未进行属性赋值)后就加入到三级缓存中,进行提前曝光,方便解决单例模式的循环依赖,在循环依赖中会去获取三级缓存中的value,得到实例化的bean或者bean的代理。
在这里插入图片描述

这里注意一下对象的创分为实例化和初始化,先实例化后初始化:

  • 实例化:实例化后的Bean可以认为是半成品的Bean,为什么这么说那,因为这时候Bean对象里面的属性值都是初始值,例如String类型的值为null,int类型的值为0.
  • 初始化:Bean被初始化之后就是完整的Bean了,这时候就可直接其他对象使用了,初始化的过程也可以认为是对对象属性赋值的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彤彤的小跟班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值