Spring底层原理之 BeanFactory 与 ApplicationContext

简介: Spring底层原理之 BeanFactory 与 ApplicationContext

一、 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);
    }
  • 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));
  }

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);
    }
  }

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:获取环境信息
System.out.println(context.getEnvironment().getProperty("java_home"));


相关文章
|
5月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
673 22
|
5月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1895 0
|
4月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
547 3
|
6月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
7月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
256 0
|
7月前
|
监控 架构师 NoSQL
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
|
Java Spring 容器
Spring中BeanFactory和FactoryBean的区别?
一位工作了4年的小伙伴,去京东面试被问到这样一个问题,Spring中的BeanFactory和FactoryBean有什么区别?因为没有看过源码,当时就感觉这是一个文字游戏,感觉没什么区别? 那今天,我就给大家来聊清楚。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。好了,我们先来看BeanFactory。
203 0
|
XML Java 数据格式
Spring中BeanFactory和FactoryBean详解
Spring中BeanFactory和FactoryBean详解
858 1
|
XML Java 数据格式
Spring5源码(8)-BeanFactory和FactoryBean的区别
Spring5源码(8)-BeanFactory和FactoryBean的区别
178 0