Spring 框架中的工厂模式(一)
1. Spring 简单概述
Spring框架本质上是一个针对Bean的生命周期进行管理的轻量级容器,其核心为Inversion of Control (IOC) 与 Aspect Orirented Programming (AOP)。其中IOC也被称 Dependency Injection (DI)。所谓依赖注入,就是由IOC容器再运行期间,动态地将某依赖关系注入到对象之中, 目的是实现对象之间的解耦。而在Spring框架中,BeanFactory作为IOC容器的顶层接口,将Bean的生命周期各个阶段通过不同的接口暴露给我们,可以让我们对其进行操作。本文着重分析Spring框架中BeanFactory的实现与传统工厂模式实现的不同点。
2. BeanFactory
在BeanFactory创建Bean实例之前,需要首先需要明白Spring是如何生成Bean的
简单来说,通过BeanDenfinitionReader从不同的方式获得BeanDefinitions,即Bean的元数据,再通过BeanDefinitionRegistry将beanDefinition注册到BeanFactory中并存储至BeanFactory的一个ConcurrentHashMap中,key为beanName, value为BeanDinfition中的元数据。此过程可由下图解释:
(图片来自Spring之BeanFactory详解_遇见更好的自己、的博客-CSDN博客_beanfactory)
除了BeanDinitionRegistry 提供对BeanDefinition的注册等操作之外,还有SingletonBeanRegistry负责对单例Bean进行注册等操作。
从BeanFactory的具体实现类来看beanDefinition被存储到DefaultListableBeanFactory中的beanDefinitionMap中,如下图所示:
区别1:与传统工厂模式不同的是,Spring框架中生成新的Bean类是通过配置文件,或者注解将Bean的属性信息等读取出来然后注册到BeanFactory中的。传统工厂模式中,比如抽象工厂模式想要生成一个JavaBean对象,需要在最顶层的AbstractFactory中加入生成该对象的方法,并在各个ConcretFactory中实现该方法,比较繁琐。
再来看BeanFactory的整体结构:
(图片来自Spring精讲:什么是BeanFactory?(附源码)_头顶假发的博客-CSDN博客_什么是beanfactory )
可以看到DefaultListableBeanFactory实现了诸多接口
-
SingletonBeanFactory:定义对单例缓冲池的操作
-
ConfiguableBeanFactory:定义可配置的BeanFactory, 如bean的classLoader等
-
AutowireCapableBeanFactory(继承关系):定义能进行自动装配的BeanFactory, 如装配类型(byName/byType), createBean, autowireBean等,与bean的生命周期相关的方法都在这里体现
…
区别2:Spring框架中 BeanFactory有很多针对不同功能接口,并且接口之间呈逐级继承关系,丰富了工厂的类型。在实现类当中也呈现逐级继承关系,高层类承担一部分接口实现的功能,如AbstractAutowireCapableBeanFactory实现了创建bean的功能。在传统工厂模式中,如抽象工厂模式 AbstractFasctory直接由一系列ConcreteFactory实现,功能比较单一,无法对功能进行拓展,且各个实现类之间没有继承关系,创建功能之间有重合的工厂时效率较低。
3. 相同点
最后,对于Java反射机制,Spring框架中的Bean动态装载过程便是通过解析xml或者properties文件中的内容获得某个class实例这一反射机制来实现的。这点与工厂模式中使用的反射机制相同,为二者的共同点。
Java程序首先经编译器 (如javac.exe) 编译成Class文件 (字节码文件),然后字节码会经JVM解释转译成机器可直接执行的机器码。
参考文章
Spring之BeanFactory详解_遇见更好的自己、的博客-CSDN博客_beanfactory
Spring精讲:什么是BeanFactory?(附源码)_头顶假发的博客-CSDN博客_什么是beanfactory