BeanFactory作为Spring核心成员到底存在哪些变体---这些变体到底有多牛(漫威多元宇宙)

前言

〉 学习Spring,你一定遇到的纠结在于BeanFactoryFactoryBean 是啥玩意,Spring 起名页太不靠谱了吧。我只想说Spring的起名还是很见名知意的。虽然这两兄弟长得很像也很容易搞混淆,但是只要理解他们的作用你就再也不会纠结了。

  • 首先BeanFactory 就是一个bean工厂, 这是Spring的基石。接下来我们先看看BeanFactory. 光是了解学习它就需要很长的篇幅了,所以今天我们只谈BeanFactory. 至于FactoryBean 我们后续继续

容器接口

  • Spring 可以说是 Java 开发者的首选框架,没有之一。不知道这么说有没有要反驳 ~~~。
  • 我们启动一个 Spring 项目非常的简单。
java 复制代码
@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
  • 不知道你有没有点进去 run 看看这个方法的结构。
java 复制代码
public static ConfigurableApplicationContext run(Class<?> primarySource,
			String... args) {
		return run(new Class<?>[] { primarySource }, args);
	}
  • 所以 ConfigurableApplicationContext 的地位不言而喻了吧。

BeanFactory

  • 通过看他的接口你可能会感觉 BeanFactory 好简单啊,基本上就一个 getBean 这个方法。但是它的内部还包括对 Bean 的生命周期管理,以及 Bean 的单例。
  • 这里我先强插一脚,在 Spring 中使用的是 DefaultListableBeanFactory 这个实现类作为 BeanFactory 的执行。我们也能够看到 DefaultListableBeanFactory 继承了很多类,这也说明它具备很多功能,不仅仅是 BeanFactory 中的 getBean

    • SingletonBeanRegistry : 注册单例 Bean
    • HierarchicalBeanFactory : 父子容器
    • ListableBeanFactory : 列出容器内 Bean
    • BeanDefinitionRegistry : 注册Bean
  • 很多的功能来自于父类. 接下来我们来随便看看它的功能,比如查看容器内单例对象,为了演示方便,这里我们就不通过代码跟踪的方式获取了。直接暴力点

  • 因为我们的 ApplicationContext 本身就具备 BeanFactory 功能,所以只需要反射下就行。

java 复制代码
	ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(A0001Application.class);
	Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
	singletonObjects.setAccessible(true);
	Map<String, Object> o = (Map<String, Object>) singletonObjects.get(configurableApplicationContext.getBeanFactory());
	for (Map.Entry<String, Object> entry : o.entrySet()) {
		System.out.println("key:"+entry.getKey()+"
value:"+entry.getValue());
	}

ApplicationContext

  • 通过上面的 UML 类图,我们能够发现它继承了 BeanFactory,说明了它具有 BeanFactory 的能力,而 BeanFactory 是获取操作 Bean 的工具类。所以 ApplicationContext 地位更加的重要。
  • ApplicationContext 比 BeanFactory 多了点啥呢?
  • 我们只需要对比下 ConfigurableApplicationContextDefaultListableBeanFactory 两个类的 UML 不难发现,ApplicationContext 大概多出了 MessageSourceResourcePatternResolverApplicationEventPublisherEnvironmentCapble 这四个类的功能。
    • MessageSource : 国际化功能
    • ResourcePatternResolver : 通配符匹配路径资源, classpath://hello/**
    • ApplicationEventPublisher : 事件
    • EnvironmentCapble : 处理配置文件 yml 等属性。

MessageSource

  • 该功能是用来处理国际化的,处理国际化其实很简单,我们只需要在 resources 下准备好对应语言的提示文件,然后通过 ApplicationContext 获取对应参数的属性值即可。

  • 配置文件是 properties 所以在 idea 中我们需要设置下对应的文件编码,否则会出现非英文乱码的。

  • 接着我们在 resources 下分别准备 汉语英语日语 三国语言。
text 复制代码
hello=你好,新华
  • 每个文件中我们准备好对应的 key 即可,然后在代码中获取的时候指定语言和 key 即可。
java 复制代码
System.out.println(configurableApplicationContext.getMessage("hello", null, Locale.CHINA));
System.out.println(configurableApplicationContext.getMessage("hello", null, Locale.ENGLISH));
System.out.println(configurableApplicationContext.getMessage("hello", null, Locale.JAPANESE));

ResourcePatternResolver

  • 该类是支持通配符获取资源文件。在 ApplicationContext 中的体现就是 getResource
相关推荐
二闹3 分钟前
三个注解,到底该用哪一个?别再傻傻分不清了!
后端
用户490558160812515 分钟前
当控制面更新一条 ACL 规则时,如何更新给数据面
后端
林太白17 分钟前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
码事漫谈18 分钟前
VS Code 终端完全指南
后端
该用户已不存在43 分钟前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
怀刃1 小时前
内存监控对应解决方案
后端
TT哇1 小时前
@[TOC](计算机是如何⼯作的) JavaEE==网站开发
java·redis·java-ee
码事漫谈1 小时前
VS Code Copilot 内联聊天与提示词技巧指南
后端
Tina学编程1 小时前
48Days-Day19 | ISBN号,kotori和迷宫,矩阵最长递增路径
java·算法
Moonbit1 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞 (上):编译前端实现
后端·算法·编程语言