01.容器接口BeanFactory和ApplicationContext

news2025/1/18 20:30:17

容器接口BeanFactory和ApplicationContext

  1. BeanFactory能做哪些事
  2. ApplicationContext有哪些扩展功能
  3. 事件解耦

重点

到底什么是BeanFactory

  1. 它是 ApplicationContext 的父接口
  2. 它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能

BeanFactory 能干点啥

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

ApplicationContext扩展了哪些功能

扩展了以下接口:MessageSource、ResourcePatternResolver、EnvironmentCapable、ApplicationEventPublisher

  1. MessageSource的getMessage方法:用来翻译多国语言,提供翻译能力

  2. ResourcePatternResolver的getResources:提供使用通配符来匹配资源的能力

  3. EnvironmentCapable的getEnvironment方法:提供获取环境变量的能力

  4. ApplicationEventPublisher的pulishEven方法:发布事件的能力

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码

/*
    BeanFactory 与 ApplicationContext 的区别
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
public class A01 {

    private static final Logger log = LoggerFactory.getLogger(A01.class);

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {
        ConfigurableApplicationContext context = SpringApplication.run(A01.class, args);
        // 在这里打断点可以看到context里有BeanFactory对象
//        context.getBean("aaa");
        System.out.println(context);


        /*
            2. BeanFactory 能干点啥
                - 表面上只有 getBean
                - 实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能, 都由它的实现类提供
         */
        // BeanFactory实际上是DefaultListableBeanFactory类型,DefaultListableBeanFactory又继承了DefaultSingletonBeanRegistry
        Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
        singletonObjects.setAccessible(true);
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // get方法,传入该Field的类类型对象,返回该队形中的该字段值
        Map<String, Object> o = (Map<String, Object>) singletonObjects.get(beanFactory);
        o.forEach((key, value) -> {
            if (!key.startsWith("component")) {
                return;
            }
            System.out.println(key + "-----" + value);
        });

        /*
            3. ApplicationContext 比 BeanFactory 多点啥
         */
        // MessageSource:用来翻译多国语言,提供翻译能力
        System.out.println(context.getMessage("hi", null, Locale.CHINA));
        System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
        System.out.println(context.getMessage("hi", null, Locale.JAPANESE));


        // ResourcePatternResolver:提供使用通配符来匹配资源的能力
        // classpath和classpath*的区别
//        Resource[] resources = context.getResources("classpath:META-INF/spring.factories");
        Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
        for (Resource resource : resources) {
            System.out.println(resource);
        }

        // EnvironmentCapable:提供获取环境变量的能力
        System.out.println(context.getEnvironment().getProperty("java_home"));
        System.out.println(context.getEnvironment().getProperty("server.port"));

        // ApplicationEventPublisher:发布事件的能力
        context.publishEvent(new UserRegisteredEvent(context));
//        context.getBean(Component1.class).register();
    }
component1-----com.shunyum.a01.Component1@4a0df195
component2-----com.shunyum.a01.Component2@42fcc7e6
���
Hello
����ˤ���
URL [jar:file:/E:/Maven/repository/repository/org/springframework/boot/spring-boot/2.5.5/spring-boot-2.5.5.jar!/META-INF/spring.factories]
URL [jar:file:/E:/Maven/repository/repository/org/springframework/boot/spring-boot-autoconfigure/2.5.5/spring-boot-autoconfigure-2.5.5.jar!/META-INF/spring.factories]
URL [jar:file:/E:/Maven/repository/repository/org/springframework/spring-beans/5.3.23/spring-beans-5.3.23.jar!/META-INF/spring.factories]
URL [jar:file:/E:/Maven/repository/repository/org/mybatis/spring/boot/mybatis-spring-boot-autoconfigure/2.2.0/mybatis-spring-boot-autoconfigure-2.2.0.jar!/META-INF/spring.factories]
URL [jar:file:/E:/Maven/repository/repository/com/alibaba/druid-spring-boot-starter/1.2.8/druid-spring-boot-starter-1.2.8.jar!/META-INF/spring.factories]
URL [jar:file:/E:/Maven/repository/repository/org/springframework/spring-test/5.3.23/spring-test-5.3.23.jar!/META-INF/spring.factories]
E:\JAVA\Java
8080
2023-04-06 23:44:01.778 DEBUG 15040 --- [           main] com.shunyum.a01.Component2               : com.shunyum.a01.UserRegisteredEvent[source=org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@649bec2e, started on Thu Apr 06 23:44:00 CST 2023]
2023-04-06 23:44:01.779 DEBUG 15040 --- [           main] com.shunyum.a01.Component2               : 发送短信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络复习】第四章 网络层 1

网络层的位置和基本功能 o 实现了端到端&#xff08;主机-主机&#xff09;的数据传输 o 路由选择 n 根据数据携带的目的主机地址为数据包选择一条的路径&#xff0c;以到达目的主机 o 主机/路由器编址 n 每个网络接口有一个唯一的IP地址 o 网络互联 n 在不同的网…

mysql数据库使用sql对特殊分隔符分隔的字段进行统计

需求 在一个数据库表中有一个字段中的数据是通过特殊符号进行分隔的&#xff0c;现需要统计分隔符分开的各数据的条数。 数据准备 -- ---------------------------- -- Table structure for persons -- ---------------------------- DROP TABLE IF EXISTS persons; CREATE TAB…

Linux 基本使用和程序部署

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Linux 常用命令lspwdcdtouchcatechovimmkdirrmmvcp搭建 Java 部署环境yumjdktomcatmysql部署 Web 项目到 Linux数据库建表微调…

万亿氢能赛道上,谁在发挥“关键力量”?谁在扮演“关键先生”?

NBA比赛中&#xff0c;在急速变化的时刻要想赢得胜利&#xff0c;需要有一股“关键力量”。 这股“力量”一方面能够组织好队员之间的协同&#xff0c;更加灵活和精准地推进战术&#xff0c;另一方面能够击中对方防守的痛点&#xff0c;投入制胜一球。这种“关键力量”通常是由…

BTP 使用SPA开发工作流

1、前言 目前SAP ABAP 工作流比较难用&#xff0c;BTP上的工作流比较简单便捷。 BTP上面有两款服务可以执行工作流&#xff0c;一种是workflow management 配合Business Rules Services简称BRS&#xff0c;还有一种是接下来会介绍的SP Bulide Process Automation 简称SBPA。 …

【linux】Ubuntu aarch64编译安装RXTX进行串口通信

目录1.下载RXTX2.源码下载方式一&#xff1a;方式二&#xff1a;3. 编译源码4.编译源码时遇到的问题问题1&#xff1a;./configure command not found问题2&#xff1a;error: UTS_RELEASE undeclared问题3&#xff1a;libtool: install: armv6l-unknown-linux-gnu/librxtxRS48…

Manjaro安装及配置

官方镜像 官方镜像地址&#xff1a;https://manjaro.org/download/ 镜像选择 镜像选择&#xff1a;PLASMA、XFCE、GNOME 按电脑性能&#xff1a;PLASMA>GNOME>XFCE(老旧电脑可以运行) 启动U盘刻录 推荐使用rufus&#xff08;win10平台&#xff0c;dd模式&#xff09…

C++ [图论算法详解] 欧拉路欧拉回路

蒟蒻还在上课&#xff0c;所以文章更新的实在慢了点 那今天就来写一篇这周刚学的欧拉路和欧拉回路吧 讲故事环节&#xff1a; 在 一个风雪交加的夜晚 18世纪初普鲁士的哥尼斯堡&#xff0c;有一条河穿过&#xff0c;河上有两个小岛&#xff0c;有七座桥把两个岛与河岸联系…

万字长文:C语言实践小练习汇总指南!

万字长文&#xff1a;C语言实践小练习汇总指南!0.说在前面1.i与i总结1.1 i与i1.2 区别总结&#xff1a;2.大小写转化3.交换字符串3.1 使用传字符串地址3.2 使用strcpy函数3.3 自写字符串交换函数3.4 同3.3自写函数4.字符串中单词4.1 统计字符串中单词个数4.2 最长单词及位置5.字…

注册页面小案例

运行截图&#xff1a; 知识点&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name&…

SwinTrack: A Simple and Strong Baseline for Transformer Tracking(NIPS2022)

SwinTrack摘要介绍相关工作方法实验摘要 近期&#xff0c;Transformer在视觉跟踪方面进行了深入探索&#xff0c;并展示了显著的潜力。然而&#xff0c;现有的基于Transformer的跟踪器主要将Transformer用于融合和增强由卷积神经网络提取的特征&#xff0c;Transformer在表征学…

另一种迁移xxl-job任务的方法,适合不满足数据迁移条件

以为多个项目组同时使用一个xxl-job&#xff0c;同时涉及到版本提升&#xff0c;由此不太满足数据库数据迁移&#xff0c;所以这里提供另一种解决办法 使用工具&#xff1a;postman,json转excel&#xff0c;excel 核心&#xff1a;excel拼接&#xff1a; 1.使用f12抓取xxl任务访…

什么是 SMART 并如何使用这个方法取得新的成就

SMART原则也许大家并不陌生&#xff0c;很多企业常常采用以激励员工更加高效的工作&#xff0c;或是被一些企业广泛采用&#xff0c;制定并实施绩效考核方案&#xff0c;SMART原则属于目标管理的范畴&#xff0c;最早是管理大师彼得德鲁克在著作中提出的。 ONLYOFFICE ONLYOFFI…

Nginx快速上手

Nginx快速上手 OVERVIEWNginx快速上手一、基本概念1.Nginx初步认识2.正向/反向代理&#xff08;1&#xff09;正向代理&#xff08;2&#xff09;反向代理二、Nginx 安装和配置1.安装2.Nginx指令3.Nginx配置三、Nginx的使用1.Web服务器&#xff08;1&#xff09;静态网页存储目…

Java对日开发成趋势?网友:找工作打开了新思路

近两年行业环境起起伏伏&#xff0c;企业降本增效&#xff0c;提高人才招聘的门槛&#xff0c;导致大家找工作时觉得越来越难&#xff0c;尤其是Java开发&#xff0c;主打的就是一个“卷”&#xff01; 不过行业变革&#xff0c;挑战与机遇并存。Java作为编程语言排行榜的常年第…

Java8 判空新写法(Optional方式)

1 引言 在文章的开头&#xff0c;先说下NPE问题&#xff0c;NPE问题就是&#xff0c;我们在开发中经常碰到的NullPointerException.假设我们有两个类&#xff0c;他们的UML类图如下图所示 在这种情况下&#xff0c;有如下代码 user.getAddress().getProvince();这种写法&…

计算机网络 实验四

⭐计网实验专栏&#xff0c;欢迎订阅与关注&#xff01; ★观前提示&#xff1a;本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求&#xff0c;因此以下内容建议仅做思路参考。 一、实验目的 理解ARP协议的工作原理掌握ARP、ICMP 处理过程 二、实验内容 利用网络…

BearPi环境搭建及基本使用

这是一篇总结&#xff0c;一些坑的记录 具体教程请访问&#xff1a; BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步&#xff1a;安装虚拟机 不做赘述 第二步&#xff1a;下载资源 这里要用到ubuntu的一些基础知识&#xff0c;不会的…

HTTP Flood攻击与防御原理

一.引言HTTP Flood攻击DDoS的一种,别称叫做CC攻击(CC是Challenge Collapsar的缩写&#xff0c;而Collapsar是国内一家著名安全公司的DDoS防御设备)&#xff0c;是针对Web服务在第七层协议发起的攻击&#xff0c;重点在于突破前端的cache,通过HTTP头中的字段设置直接到达Web Ser…

精通线程池,看这一篇就够了

一&#xff1a;什么是线程池 当我们运用多线程技术处理任务时&#xff0c;需要不断通过new的方式创建线程,这样频繁创建和销毁线程&#xff0c;会造成cpu消耗过多。那么有没有什么办法避免频繁创建线程呢&#xff1f; 当然有&#xff0c;和我们以前学习过多连接池技术类似&…