大家都说要多阅读spring的代码,这非常在理,毕竟spring的代码是许许多多杰出工程师的结晶,是业界多年的累积。

最近也不是非常忙,所以准备记录一系列的相关代码。

工厂模式是所有人都会的模式,是最简单也最常用的模式。

为什么称为工厂模式,因为这个完全是借鉴实际产生的一种模式。

  1. 通过工厂模式,可以简化采购商(用户)的工作,也能够简化工厂的工作。
  2. 对于用户而言,只需要关心要什么,不需要重点关心如何生产;对于工厂(设计人员)而言,只需要关注如何实现,并把产品放在货架上即可。
  3. 工厂的产品之间可以有相似性(通常),但也允许没有任何的关系。例如一个商场可以卖食品也可以卖衣服、家具等等。当然为了方便,有专门卖食品、衣服、家具的

如果不用工厂模式会怎么样?其实也不会怎么样,就是不那么方便,这种不方便可大可小。

所以,总体来说能用就用。

本文不会介绍bean工厂的每个产品是如何定义的,这是因为spring的bean工厂是杂货铺,什么类型都有的,所以介绍有什么产品没有什么意义。

在spring中,很多地方都有工厂模式的应用,比较典型的就是bean工厂。

一、bean工厂类层次

所有的bean工厂的实现都基于BeanFactory这个接口,下图是spring6.x中默认bean工厂的类层次图:

也就是说默认情况下spring6.x实现的bean工厂是 DefaultListableBeanFactory(org.springframework.beans.factory.support.DefaultListableBeanFactory)。

反过来说,在spring中有多个的bean工厂实现。

二、DefaultListableBeanFactory的数据结构

以下是DefaultListableBeanFactory的部分代码:

@SuppressWarnings("serial")
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { @Nullable
private static Class<?> javaxInjectProviderClass; static {
try {
javaxInjectProviderClass =
ClassUtils.forName("jakarta.inject.Provider", DefaultListableBeanFactory.class.getClassLoader());
}
catch (ClassNotFoundException ex) {
// JSR-330 API not available - Provider interface simply not supported then.
javaxInjectProviderClass = null;
}
} /** Map from serialized id to factory instance. */
private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
new ConcurrentHashMap<>(8); /** Optional id for this factory, for serialization purposes. */
@Nullable
private String serializationId; /** Whether to allow re-registration of a different definition with the same name. */
private boolean allowBeanDefinitionOverriding = true; /** Whether to allow eager class loading even for lazy-init beans. */
private boolean allowEagerClassLoading = true; /** Optional OrderComparator for dependency Lists and arrays. */
@Nullable
private Comparator<Object> dependencyComparator; /** Resolver to use for checking if a bean definition is an autowire candidate. */
private AutowireCandidateResolver autowireCandidateResolver = SimpleAutowireCandidateResolver.INSTANCE; /** Map from dependency type to corresponding autowired value. */
private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16); /** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); /** Map from bean name to merged BeanDefinitionHolder. */
private final Map<String, BeanDefinitionHolder> mergedBeanDefinitionHolders = new ConcurrentHashMap<>(256); /** Map of singleton and non-singleton bean names, keyed by dependency type. */
private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64); /** Map of singleton-only bean names, keyed by dependency type. */
private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64); /** List of bean definition names, in registration order. */
private volatile List<String> beanDefinitionNames = new ArrayList<>(256); /** List of names of manually registered singletons, in registration order. */
private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16); /** Cached array of bean definition names in case of frozen configuration. */
@Nullable
private volatile String[] frozenBeanDefinitionNames; /** Whether bean definition metadata may be cached for all beans. */
private volatile boolean configurationFrozen;
}

和所有的工厂类类似,DefaultListableBeanFactory也有货架(保存商品/实例)的属性,这里还挺多的:

beanDefinitionMap

allBeanNamesByType

singletonBeanNamesByType

。。。

更多代码略。

spring在初始化的时候,会往这些数据结构中塞入有关的数据(bean名称和对应的实例等等).

---

三、其它代码

其它代码是为了实现工厂完备所需要的一些非核心(相对工厂概念而言)代码,内容还是挺多的。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/support/DefaultListableBeanFactory.html

在实际编码的时候,如果不想过多发挥,那么直接适用适用Bean工厂的工具类获取当前的bean工厂即可,并利用工厂提供的各种丰富功能实现诸如:

1.注册bean

2.下架bean

3.罗列bean

..

spring与设计模式之一工厂模式的更多相关文章

  1. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

  2. Spring中如何使用工厂模式实现程序解耦?

    目录 1. 啥是耦合.解耦? 2. jdbc程序进行解耦 3.传统dao.service.controller的程序耦合性 4.使用工厂模式实现解耦 5.工厂模式改进 6.结语 @ 1. 啥是耦合.解 ...

  3. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  4. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  7. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  8. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  9. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  10. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

随机推荐

  1. dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 用户设备上不存在 Arial 字体将导致应用闪退

    本文来告诉大家 WPF 已知问题,在用户的设备上,如果不存在 Arial 字体,同时安装了一些诡异的字体,那么也许就会让应用在使用到诡异的字体的时候,软件闪退 在 WPF 的 FontFamily.c ...

  2. python入门_模块2

    0.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...

  3. python 打包成exe可执行文件

    一.pyinstall打包 代码编写完成,如何在没有python环境的电脑上运行?编写了一个GUI程序,如何把文件打包好,发给别人直接使用?其实最简单的办法就是把.py源文件,打包成可执行程序员exe ...

  4. ansible系列(35)--ansible实战之部署WEB集群架构(5)

    目录 1. 整体测试 1.1 运行playbook 1.2 出口路由器防火墙规则设置 1.3 访问测试 1. 整体测试 1.1 运行playbook playbook的整体运行过程如下(因为之前都运行 ...

  5. ansible(14)--ansible的get_url模块

    1. get_url模块 功能:通过互联网下载软件至被控端本地: 主要参数如下: 参数 说明 url 资源文件在互联网上的具体url地址 dest 文件下载位置的绝对路径 mode 文件下载位置的绝对 ...

  6. 从零在win10上测试whisper、faster-whisper、whisperx在CPU和GPU的各自表现情况

    Anaconda是什么? Anaconda 是一个开源的 Python 发行版本,主要面向数据科学.机器学习和数据分析等领域.它不仅包含了 Python 解释器本身,更重要的是集成了大量的用于科学计算 ...

  7. width:100%与width:auto区别

    小知识 width:100%与width:auto区别 width:100% : 子元素的 content 撑满父元素的content,如果子元素还有 padding.border等属性,或者是在父元 ...

  8. JDK源码阅读-------自学笔记(十二)(java.lang.StringBuffer和StringBuilder比较)

    StringBuilder结构

  9. 前瞻 PHP8.4 的新特性

    前瞻 PHP8.4 的新特性 PHP 8.4 将于 2024 年 11 月 21 日发布.它将包括属性钩子.JIT 改进,以及在不需要额外括号的情况下链式调用方法.这是一个大变化! 属性钩子 RFC ...

  10. linux文件的三个时间,修改文件时间为任意时间

    目录 一.文件的三个时间 二.修改文件的三种时间为任意时间 一.文件的三个时间 当我们在linux中创建了文件或文件夹,文件/文件夹就有了时间属性,而且linux中的文件具有三个时间,可以通过stat ...