
🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis
石可破也,而不可夺坚;丹可磨也,而不可夺赤。 
Spring底层原理
- 一、 BeanFactory 与 ApplicationContext
- 二、 BeanFactory 功能
- 三、ApplicationContext 功能
- 3.1 getMessage
- 3.2 getResources
- 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的具体实现:
public Object getBean(String name) throws BeansException {this.assertBeanFactoryActive();return this.getBeanFactory().getBean(name);}
- 从getBean的具体实现中可以看出,首先是获取BeanFactory,然后调用BeanFactory中的getBean方法,实际上调用的是BeanFactory的getBean方法。
- BeanFactory是- ApplicationContext的一个成员变量:

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