文章目录
- 前述
- BeanFactory
- FactoryBean
- ObjectFactory
前述
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了,这时候就可直接其他对象使用了,初始化的过程也可以认为是对对象属性赋值的过程。