我们先暂时把什么容器Bean放一边,单纯的去看SpringBoot启动,他到底启动了一个什么东西。
通过ApplicationContext找到BeanFactory
public static void main(String[] args) {
SpringApplication.run(ZhangPengWebApplication.class, args);
}
查看里面的执行的方法run到底返回一个什么对象?
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class[]{primarySource}, args);
}
返回的对象是一个ConfigurableApplicationContext的东西,来我们crtl+alt+U来看一下他的类图。
里面是有些老熟人的,我们先抓住一条线如下:
ConfigurableApplicationContext (继承)ApplicationContext (继承)XXXXBean Factory (继承) BeanFactory
继承很简单,我可以复用代码和扩展,相当于一代一代去丰富内容,甚至干脆多继承几个。
这时候,我们就要问BeanFactory是什么,用途是什么,他和后面几个“继承者”们的关系?
实际上spring代码还是比较讲究的,BeanFactory实际上可以说是Spring的核心容器。
BeanFactory在上面的图上就可以看出是ApplicationContext 的父类
Bean是Spring的核心容器,在于不管你是什么ApplicationContext都会有他的变量BeanFactory或者说是有getFBeanFactory的方法(当然会根据不同环境选择不同的BeanFactory)
这个是来自ApplicationContext获取BeanFactory
BeanFactory能干点啥?
看之前先通过ide的Structure来看一下BeanFactory的大体结构和里面的方法变量(实际ctrl+F12也是可以实现同样的效果),如下:
通过点击过去发现BeanFactory就是提供了一个getBean,帮助你获得bean而不是实际去创建而已。
实际上控制反转,基本的依赖注入,Bean的生命周期各种功能都是由他和他的实现类来完成的。
我们查看一下context和beanFantory,在springboot的具体都有啥:
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
ConfigurableApplicationContext context = SpringApplication.run(DingWebApplication.class, args);
System.out.println("--------------------------context----------------------------------");
System.out.println(context);
Field single = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
single.setAccessible(true);
ConfigurableListableBeanFactory factory = context.getBeanFactory();
System.out.println("--------------------------------------------------------------------");
}
看一下这个ConfigurableApplicationContext
可以说环境什么的都在里面有体现