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


相关文章
|
6天前
|
Java 应用服务中间件 Spring
解析Spring Boot自动装配的原理与机制
解析Spring Boot自动装配的原理与机制
17 4
|
4天前
|
前端开发 Java 数据库连接
Spring的工作原理(一)简介
Spring的工作原理(一)简介
7 1
|
4天前
|
XML Java 数据格式
Spring的工作原理(二)IOC-DI
Spring的工作原理(二)IOC-DI
9 0
|
4天前
|
Java 测试技术 数据安全/隐私保护
微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
|
4天前
|
存储 安全 Java
spring security原理-学习笔记1-整体概览
spring security原理-学习笔记1-整体概览
|
5天前
|
缓存 安全 Java
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
|
6天前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
10 0
|
XML Java 数据格式
Spring面试底层原理的那些问题,你是不是真的懂Spring?
1、什么是 Spring 框架?Spring 框架有哪些主要模块?Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。
1477 0
|
1天前
|
Java
springboot自定义拦截器,校验token
springboot自定义拦截器,校验token
12 6
|
2天前
|
Java 关系型数据库 MySQL
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
10 4