第一讲:BeanFactory和ApplicationContext接口

这篇具有很好参考价值的文章主要介绍了第一讲:BeanFactory和ApplicationContext接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1. 什么是BeanFactory?

BeanFactory是ApplicationContext的父接口,是真正的Spring核心容器,主要的ApplicationContext实现都【组合】了他的功能。


2. BeanFactory能做什么?

首先先看一下BeanFactory的接口定义:
第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot

表面上只有getBean功能,实际上控制反转、基本的依赖注入、直至Bean的生命周期的各种功能,都由他的实现类提供,例如:DefaultListableBeanFactory

DefaultListableBeanFactory不仅仅实现了BeanFactory,还额外拓展了非常多的接口,例如:SingletonBeanRegistry(单例),其实现类中的私有成员变量DefaultSingletonBeanRegistry#singletonObjects,包含了所有的单例Bean对象。

接下来,我们可以试着获取到容器中所有的单例对象(因为是私有成员变量,所以需要通过反射来暴力破解)。核心代码如下:

Field field = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
field.setAccessible(true);
// 获取到BeanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Map<String, Object> singletons = (Map<String, Object>)field.get(beanFactory);

第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot


3.ApplicationContext对比BeanFactory的额外功能?

第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot

从上图可以看出,ApplicationContext对比BeanFactory额外拓展了一些功能,主要是EnvironmentCapableMessageSourceApplicationEventPublisherResourcePatternResolver

下面,我们逐个分析这几个功能。

  • MessageSource:支持项目的国际化
  • ResourcePatternResolver:通过通配符来获取文件
  • EnvironmentCapable:获取系统变量或者应用中定义的变量
  • ApplicationEventPublisher:发布事件

3.1 MessageSource

在项目的资源目录下,创建一个Resouce Bundle
第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot

共包含3个文件,所有语言通用的messages.properties、中文、英文。

// 测试MessageSource接口的功能
System.out.println(context.getMessage("hi", null, Locale.CHINA));
System.out.println(context.getMessage("hi", null, Locale.ENGLISH));

第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot

控制台分别输出了你好hello, Locale一般是浏览器发起请求时,会自动携带的,因此不需要在代码里面写死。

3.2 ResourcePatternResolver

ResourcePatternResolver可以通过通配符来获取文件,如下:

  • classpath: : 从第一个classpath中加载。
  • classpath*: : 从所有的classpath中加载。
  • file: : 从文件系统加载资源。
  • jar: : 用于从 jar 文件加载的 URL 前缀。
  • war: : 用于从 Tomcat 上的war文件加载的 URL 前缀。
// 测试ResourcePatternResolver的功能
Resource[] resources = context.getResources("classpath*:/META-INF/spring.factories");
Lists.newArrayList(resources).forEach(System.out::println);

可以发现,所有的spring.factories文件都被找到了。

第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot

3.3 EnvironmentCapable

可以获取到服务器上的变量或者应用中的变量。变量名称不区分大小写

// 测试EnvironmentCapable的功能
ConfigurableEnvironment environment = context.getEnvironment();
System.out.println("JAVA_HOME:" + environment.getProperty("java_home"));
System.out.println("Server port is: " + environment.getProperty("server.port"));

在我的电脑中配置的JAVA_HOME是大写的,这边写小写,依然可以读取到。

第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot

3.4 ApplicationEventPublisher

事件发布器是Spring中非常重要的一个机制,属于发布订阅模式。可以用来解耦业务,支持异步执行。


public class UserRegisteredEvent extends ApplicationEvent {

    /**
     * 用户手机号码
     */
    private String phone;

    public UserRegisteredEvent(Object source, String phone) {
        super(source);
        this.phone = phone;
    }
}

首先编写一个用户注册事件类,继承于ApplicationEvent, 有一个自定义的成员变量:phone

/**
 * 完成用户注册逻辑
 *
 * @Date 2023/8/20 11:30
 */
@Component
@Slf4j
public class Component01 {

    @Resource
    private ApplicationEventPublisher eventPublisher;

    public void handleUserRegistered() {
        log.info("用户注册~");
        // 发布用户已注册事件
        eventPublisher.publishEvent(new UserRegisteredEvent(this, "119"));
    }
}

Component01处理用户注册逻辑,并且发布了上述事件。

/**
 * 事件监听器
 *
 * @Date 2023/8/20 11:30
 */
@Component
@Slf4j
public class Component02 {

    @EventListener
    public void handleUserRegistered(UserRegisteredEvent event) {
        log.info("发送短信了~");
    }
}

Component02由于handleUserRegistered方法上标注了@EventListener注解,并且方法的参数为UserRegisteredEvent,说明这个组件监听了该事件。就可以做后续的业务处理了。

// 测试ApplicationEventPublisher的功能
Component01 bean = (Component01) context.getBean("component01");
bean.handleUserRegistered();

最后,在main方法中模拟调用一下,结果如下:

第一讲:BeanFactory和ApplicationContext接口,Spring源码学习,java,开发语言,spring,springboot


4.总结

BeanFactory和ApplicationContext并不仅仅是简单的接口继承关系,ApplicationContext组合并扩展了BeanFactory的功能。文章来源地址https://www.toymoban.com/news/detail-660622.html

到了这里,关于第一讲:BeanFactory和ApplicationContext接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring学习】走进spring,spring的创建和使用,spring获取Bean的几种常见方式, ApplicationContext 和 BeanFactory的区别(重点面试)

    前言: 大家好,我是 良辰丫 ,我们在上一篇文章不是简单介绍了SpringBoot嘛,为什么不学习SpringBoot,而是要开始Spring呢?Spring是SpringBoot的前身,我们先学习以前的稍微复杂的框架,才能更好的学习SpringBoot.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志

    2024年02月08日
    浏览(45)
  • Spring之BeanFactory与ApplicationContext区别、实例化Bean的三种⽅式、延迟加载(lazy-Init )

    BeanFactory是Spring框架中IoC容器的顶层接⼝,它只是⽤来定义⼀些基础功能,定义⼀些基础规范,⽽ApplicationContext是它的⼀个⼦接⼝,所以ApplicationContext是具备BeanFactory提供的全部功能的。 通常,我们称BeanFactory为SpringIOC的基础容器, ApplicationContext是容器的⾼级接⼝,⽐BeanFactory要拥

    2024年02月11日
    浏览(38)
  • BeanFactory与ApplicationContext基本介绍

    接口 定义能力, 抽象类 实现接口的一些重要方法,最后 实现类 可以实现自己的一些逻辑 仅仅是一个接口,Spring 的核心容器,并不是IOC容器的具体实现,它的一些具体实现类才是 BeanFactory 是 ApplicationContext 的父接口 BeanFactory才是 Spring 的核心容器, 主要的 ApplicationContext 实现

    2024年02月13日
    浏览(37)
  • BeanFactory和ApplicationContext的区别

    BeanFactory与ApplicationContext的关系 BeanFactory是Spring的早期接口,称为 Spring的Bean工厂 ,ApplicationContext是后期更高级接口,称之为 Spring容器 ; ApplicationContext在BeanFactory基础上对功能进行了扩展,例如: 监听功能、国际化功能 等。 BeanFactory 的API更 偏向底层 , ApplicationContext 的A

    2024年02月06日
    浏览(37)
  • BeanFactory和ApplicationContext区别及详解

    ​ Spring 框架带有两个 IOC 容器—— BeanFactory 和 ApplicationContext 。 BeanFactory 是 IOC 容器的最基本版本, ApplicationContext 扩展了 BeanFactory 的特性。 ​ Spring容器最基本的接口就是BeanFactory。BeanFactory负责配置、创建、管理Bean,它有一个子接口ApplicationContext,也被称为Spring上下文,

    2023年04月10日
    浏览(35)
  • 解锁ApplicationContext vs BeanFactory: 谁更具选择性?

    目录 一、聚焦源码回顾 (一)源码分析和理解 (二)简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 (一)主要特性总结 (二)直接建议 三、案例简单说明 (一)加载少量的 Bean的案例 (二)简单的命令行工具:用于读取配置文件并生成报告 (三)启动时加

    2024年04月25日
    浏览(32)
  • Spring源码-浅识BeanFactory

    在SpringBoot出现之前,我们使用Spring需要以配置文件的方式进行启动.如果使用XML文件配置.则通过 XmlWebApplicationContext.java 进行启动.常应用在Web项目的开发中. 以此为例,通过阅读源码发现和 XmlWebApplicationContext.java \\\"平级\\\"的类如下所示 由此我们可以知道 ApplicationContext 遵循 Applicat

    2024年02月03日
    浏览(43)
  • 深度解析 Spring 源码:揭秘BeanFactory 之谜

    1.1 BeanFactory的概述 BeanFactory是Spring框架中的一个核心接口,它提供了一种灵活的方式来管理Bean,并实现了IoC(控制反转)和DI(依赖注入)等特性,为应用程序提供了灵活、可扩展的对象管理和配置机制。 BeanFactory的特性 : IoC容器: BeanFactory是Spring的IoC容器之一。IoC是一种

    2024年04月26日
    浏览(39)
  • 【Spring源码】 BeanFactory和FactoryBean是什么?

    面试官:“看过Spring源码吧,简单说说Spring中BeanFactory和FactoryBean的区别是什么?” 大神仙:“BeanFactory是bean工厂,FactoryBean是工厂bean”。 这么回答,等于面试官问你Spring是什么,你回答这个单词翻译叫春天。 首先看下C知道(ChitGPT)的回答 没错,基本上已经给出了答案。

    2023年04月19日
    浏览(41)
  • Spring源码笔记之SpringIOC--(3)什么是BeanFactory?

    什么是BeanFactory? BeanFactory 是SpringIOC的最顶层接口,涵盖了IOC容器最基本的操作。 ListableBeanFactory 、 ConfigurableBeanFactory 提供了IOC容器获取所有Bean、配置Bean的额外能力。所有 BeanFactory 的实现类持有所有Bean的定义 BeanDefinition ,用一个唯一的字符串(即Bean的名字)区分。 Bean

    2024年02月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包