一、 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
- 从容器中获取bean
context.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"));