1.BeanFactory 与 ApplicationContext 的联系
可以看出ApplicationContext 间接继承了 BeanFactory
- BeanFactory 接口,典型功能有:
- ApplicationContext 接口,是 BeanFactory 的子接口。它扩展了 BeanFactory 接口的功能,如:
- 国际化
- 通配符方式获取一组 Resource 资源
- 整合 Environment 环境(能通过它获取各种来源的配置信息)
- 事件发布与监听,实现组件之间的解耦
2.BeanFactory 与 ApplicationContext 的区别
2.1 到底什么是 BeanFactory
- 它是 ApplicationContext 的父接口
- 它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能,【组合】是指 ApplicationContext 的一个重要成员变量就是 BeanFactory
BeanFactory 能干点啥
- 表面上只有 getBean
- 实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能,都由它的实现类提供
- 例子中通过反射查看了它的成员变量 singletonObjects,内部包含了所有的单例 bean
[获得所有单例Bean]
@SpringBootApplication
public class Application {
public static void main(String[] args)throws Throwable{
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
Field field = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
field.setAccessible(true);
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Map<String, Object> map = (Map<String, Object>) field.get(beanFactory);
map.forEach((k, v) -> {
System.out.println("k:" + k);
System.out.println("v:" + v);
});
}
}
2.2 ApplicationContext 比 BeanFactory 多点啥
- ApplicationContext 组合并扩展了 BeanFactory 的功能
- 国际化、通配符方式获取一组 Resource 资源、整合 Environment 环境、事件发布与监听
[获取资源功能]
获取classpath*:META-INF/spring.factories 下的所有资源
@SpringBootApplication
public class Application {
public static void main(String[] args)throws Throwable{
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
for (Resource resource : resources) {
System.out.println(resource);
}
}
}
[获取环境配置功能]
@SpringBootApplication
public class Application {
public static void main(String[] args)throws Throwable{
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
System.out.println(context.getEnvironment().getProperty("java_home"));
System.out.println(context.getEnvironment().getProperty("os.name"));
System.out.println(context.getEnvironment().getProperty("server.port"));
}
}
1.获取java_home配置 2.获取操作系统名称 3.获取配置端口
|