直接找到BeanFactory的源码,按ctrl+F12查看整个类的结构,有如下结果:
表面上看起来很简单,仿佛就是几个函数而已。实际上BeanFactory的功能实现都在它的默认实现类中,即DefaultListableBeanFactory中。我们找到这个类,并查看它的继承关系图:
显然,它实现了BeanFactory。我们从它实现的一个单例Bean类来进行分析,即DefaultSingletonBeanFactory中进行分析,查看源码:
这个红色的Map集合就是所有的单例对象了。我们通过反射拿到这个私有对象,编写测试代码如下:
try {
Field singletonFactories = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
singletonFactories.setAccessible(true);
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
Map<String,Object> map = (Map<String,Object>)singletonFactories.get(beanFactory);
map.forEach((k,v)->{
System.out.println("k:" + k + ",v:" + v);
});
} catch (Exception e) {
throw new RuntimeException(e);
}
通过反射代码拿到DefaultSingletonBeanRegistry实例中的singletonObjects,并输出,我么可以看到结果其实就是应用程序中的单例对象:
使用@SpringConfiguration+@Bean注解的Commponent也在对应的输出列表中:
/**
* 2.BeanFactory能干点啥
* - 表面上只有getBean
* - 实际上控制反转、基本的依赖注入、直至Bean的生命周期的各种功能,都是由他的实现类来提供
*/