• Spring底层原理之 BeanFactory 与 ApplicationContext



    在这里插入图片描述

    🐌个人主页: 🐌 叶落闲庭
    💨我的专栏:💨
    c语言
    数据结构
    javaEE
    操作系统
    Redis

    石可破也,而不可夺坚;丹可磨也,而不可夺赤。


    一、 BeanFactory 与 ApplicationContext

    • 什么是BeanFactory ?
      • BeanFactory 是ApplicationContext的父接口
      • BeanFactory 才是Spring的核心容器,主要的ApplicationContext实现都组合了它的功能
    • 在SpringBoot的引导类中,利用SpringApplication.run(DobboProApplication.class, args);代码启动Spring程序,其中,第一个参数是引导类类型,第二个参数是main方法传过来的命令行参数
    • 这个run方法有一个返回结果:ConfigurableApplicationContext context = SpringApplication.run(DobboProApplication.class, args);
    • 这个返回结果所对应的对象就是Spring容器
      在这里插入图片描述
    • 从类图中可以看出,ApplicationContext间接继承了BeanFactory
    • 从容器中获取beancontext.getBean("aaa");
    • 获取bean的方法并不是ApplicationContext提供的,而是间接使用BeanFactory提供的getBean方法
    • 可以看一下getBean的具体实现:
    public Object getBean(String name) throws BeansException {
            this.assertBeanFactoryActive();
            return this.getBeanFactory().getBean(name);
        }
    
    • 1
    • 2
    • 3
    • 4
    • getBean的具体实现中可以看出,首先是获取BeanFactory,然后调用BeanFactory中的getBean方法,实际上调用的是BeanFactorygetBean方法。
    • BeanFactoryApplicationContext的一个成员变量:

    在这里插入图片描述


    二、 BeanFactory 功能

    • BeanFactory 的接口

    在这里插入图片描述


    • BeanFactory 的实现类:

    在这里插入图片描述


    • BeanFactory对于控制反转、基本的依赖注入、Bean的生命周期,都有其对应的实现类

    三、ApplicationContext 功能

    3.1 getMessage

    • getMessage:读取一个key翻译后的结果,可以支持多种语言(中文、英文等)
    public static void main(String[] args) {
    		ConfigurableApplicationContext context = SpringApplication.run(DobboProApplication.class, args);
    		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));
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.2 getResources

    • getResources:获取资源
    • classpath::从类路径中获取资源
    • file::从磁盘路径中获取资源
    public static void main(String[] args) throws IOException {
    		ConfigurableApplicationContext context = SpringApplication.run(DobboProApplication.class, args);
    		Resource[] resources = context.getResources("classpath:application.properties");
    		for (Resource resource : resources) {
    			System.out.println(resource);
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    public static void main(String[] args) throws IOException {
    		ConfigurableApplicationContext context = SpringApplication.run(DobboProApplication.class, args);
    		Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
    		for (Resource resource : resources) {
    			System.out.println(resource);
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述


    3.3 getEnvironment

    • getEnvironment:获取环境信息
    System.out.println(context.getEnvironment().getProperty("java_home"));
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    [项目管理-9]:软硬件项目管理 - 风险管理(坑)
    Spark -- Spark3.2.2集成Hudi 0.11.1并同步Hive 3.1.3
    idea热部署-修改代码不重启
    3D bounding box网络简化
    曦力音视频转换工具Xilisoft Video Converter Ultimate mac中文版
    C++ 输入输出优化
    CAD二次开发--点击窗体按钮后还要再次点击CAD获取焦点才能进行操作?【winform/wpf与CAD焦点切换滞后问题解决办法】
    (10)外观模式
    我如何才能保护我的私钥?
    Laravel 不经常用的小技巧
  • 原文地址:https://blog.csdn.net/qq_64743563/article/details/133146126