Spring底层原理之 BeanFactory 与 ApplicationContext


🐌个人主页: 🐌 叶落闲庭

💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

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


Spring底层原理

  • [一、 BeanFactory 与 ApplicationContext](#一、 BeanFactory 与 ApplicationContext)
  • [二、 BeanFactory 功能](#二、 BeanFactory 功能)
  • [三、ApplicationContext 功能](#三、ApplicationContext 功能)
    • [3.1 getMessage](#3.1 getMessage)
    • [3.2 getResources](#3.2 getResources)
    • [3.3 getEnvironment](#3.3 getEnvironment)

一、 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的具体实现:
c 复制代码
public Object getBean(String name) throws BeansException {
        this.assertBeanFactoryActive();
        return this.getBeanFactory().getBean(name);
    }
  • getBean的具体实现中可以看出,首先是获取BeanFactory,然后调用BeanFactory中的getBean方法,实际上调用的是BeanFactorygetBean方法。
  • BeanFactoryApplicationContext的一个成员变量:


二、 BeanFactory 功能

  • BeanFactory 的接口


  • BeanFactory 的实现类:


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

三、ApplicationContext 功能

3.1 getMessage

  • getMessage:读取一个key翻译后的结果,可以支持多种语言(中文、英文等)
java 复制代码
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));
	}

3.2 getResources

  • getResources:获取资源
  • classpath::从类路径中获取资源
  • file::从磁盘路径中获取资源
java 复制代码
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);
		}
	}
java 复制代码
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);
		}


3.3 getEnvironment

  • getEnvironment:获取环境信息
java 复制代码
System.out.println(context.getEnvironment().getProperty("java_home"));
相关推荐
曹牧6 小时前
文档格式:OFD
java
豆角焖肉6 小时前
Maven进阶与搭建私服
java·maven
空中湖6 小时前
Spring AI Agent 编排:ReAct 模式 + 多 Agent 协作实战
人工智能·spring·react.js
大不点wow6 小时前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm
止语Lab6 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活6 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
噢,我明白了6 小时前
Java中日期和字符串的处理
java·开发语言·日期
程序员天天困6 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn6 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
dkbnull6 小时前
Spring Boot请求处理组件对比详解
java·spring boot