一般来说,在Springboot项目中,我们的项目启动文件中都有这样一行代码:
SpringApplication.run(SpringtestApplication.class, args);
这行代码的目的其实就是启动应用程序,并获得上下文环境。在这里,我们不妨用一个变量来接收这个函数的返回值:(这里使用idea的自动声明变量Alt+Enter)
ConfigurableApplicationContext context = SpringApplication.run(SpringtestApplication.class, args);
那这个返回值里面到底有什么呢?我们打上断点并运行项目,查看context中的内容:
可以发现,context里面其实就是整个应用程序的上下文,包含有大量程序运行时的bean。进一步地,我们通过观察context的继承关系图,可以看到如下结果:
其中,最上层的接口就是BeanFactory,也就是真正Spring的核心容器。
我们常常会用到这样一行代码来获取运行时的bean对象(根据对象名字获取bean):
context.getBean("aaa");
按住ctrl+alt,点到这个getBean函数的实现位置,我们可以看到如下代码:
public Object getBean(String name) throws BeansException {
this.assertBeanFactoryActive();
return this.getBeanFactory().getBean(name);
}
显然,实际上ConfigurableApplicationContext中实现getBean方法的原理是根据BeanFactory来获得的。
因此,BeanFactory和ApplicationContext两者之间的关系就出来了:
/**
* 1.到底什么是BeanFactory
* - 它是ApplicationContext的父接口
* - 它才是Spring的核心容器,主要的ApplicationContext实际都[组合]了它的功能
*/