ApplicationContext接口
@SpringBootApplication
public class A01 {
private static final Logger log = LoggerFactory.getLogger(A01.class);
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {
//启动SpringBoot程序的方法
//这个方法返回的结果是Spring容器,两个参数(引导类的类型,main方法传递过来的命令行参数)
ConfigurableApplicationContext context = SpringApplication.run(A01.class, args);
}
通过SpringBoot的特定启动类,我们可以得到 ConfigurableApplicationContext,ApplicationContext的一个子接口,我们现在可以看这个ConfigurableApplicationContext子接口的内图:
从这里我们可以知道:ApplicationContext实际上间接地继承了BeanFactory接口,对于BeanFactory而言,它提供了一些功能上的扩展,这些主要的功能扩展为ApplicationContext接口右侧的四个接口,每继承一个父接口,就意味着它又基本一项新能力,告诉我们:ApplicationContext的功能肯定要比BeanFactory的多
-
ApplicationContext 接口,是 BeanFactory 的子接口。它扩展了 BeanFactory 接口的功能,如:
-
国际化
-
通配符方式获取一组 Resource 资源
-
整合 Environment 环境(能通过它获取各种来源的配置信息)
-
事件发布与监听,实现组件之间的解耦
-
BeanFactory接口
在Spring容器中, BeanFactory是spring里最顶层接口;包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean生命周期,维护bean之间的依赖关系
context.getBean("aaa))
我们以常见的getBean()方法为例,实际上这个方法不是ApplicationContext提供的功能,而是间接地由BeanFactory来提供功能,如下图所示:
ApplicationContext是怎么扩展的呢?它不是将所有的方法进行重写,而是内部组合了一个BeanFactory,你要调用 ApplicationContext的getBean(),它实际上内部是调用了BeanFactory的getBean(),功能是人家的getBean()提供的,从这里我们可以看出:BeanFactory要比 ApplicationContex更核心一些,主要的 ApplicationContext 实现都【组合】了它的功能,【组合】是指 ApplicationContext 的一个重要成员变量就是 BeanFactory
从这里我们可以看到context容器对象里面有很多成员变量,beanFactory就是其中一个
总结:
到底什么是 BeanFactory?
-
它是 ApplicationContext 的父接口
-
它才是 Spring 的核心容器, 主要的 ApplicationContext 实现都【组合】了它的功能,【组合】是指 ApplicationContext 的一个重要成员变量就是 BeanFactory