⑥. 组合DefaultListableBeanFactory有何用?
DefaultListableBeanFactory它这里面有一些Map,serializableFactories这个map里面引入的是自己的工厂,组合模式,还是组合自己,自己组合自己会形成整个工厂的继承树,每一个工厂都会有它的一个唯一ID用Map,也就是说在Spring中整个用起来只有一个工厂,实际上Spring里面可以允许有无数个工厂,每一个工厂都能够造一些东西。
这样做的好处就是工厂跟工厂之间造的bean可以隔离起来,所以有的时候环境里面有某些bean不想让别人引用到,但是只需要它的这个范围内引用到就可以多个工厂模式,当然截止到目前,还没有看到任何一个项目里面有用到多工厂的,但是Spring底层有定义
/** Map from serialized id to factory instance. */ //这里引入的是自己的工厂,组合模式,还是组合自己,自己组合自己会形成整个工厂的继承树 private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =new ConcurrentHashMap<>(8);
/** List of bean definition names, in registration order. */ //beanDefinitionNames :bean定义的名字,这里就是保存bean定义的名字, //也就是资料库里面保存所有bean定义的名字 private volatile List<String> beanDefinitionNames = new ArrayList<>(256); /** Map of singleton-only bean names, keyed by dependency type. */ //ingletonBeanNamesByType:按照类型保存单实例的,这也就解释了,spring底层,能够按照类型找到组 //件的一个底层池,其实就是在map拿,就是组件创建好了, 传一个类型,然后从这个map中得到这个类型对应 //的组件的名字,然后再从ioc容器中按照名字得到组件。 private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64); /** Map of singleton and non-singleton bean names, keyed by dependency type. */ //allBeanNamesByType:按照这个类型找到所有的bean private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64); /** Map of bean definition objects, keyed by bean name. */ //beanDefinitionMap:所有bean定义信息的集合,按照名字以及对应BeanDefinition关系都保存好了, //这也解释了Spring架构原理里面,Spring解析来的所有资源都会存在这个档案馆,这个档案馆就是一个 //beanDefinitionMap private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
⑤. DefaultListableBeanFactory档案馆
①. 可以看出来DefaultListableBeanFactory是BeanDefinitionRegistry(Bean定义信息注册中心),也是SimpleAliasRegistry(别名中心),还是SingletonBeanRegistry(单实例bean的中心),还是BeanFactory(Bean工厂),所以这就是总档案馆(DefaultListableBeanFactory)
②. 总档案馆DefaultListableBeanFactory虽然没有跟IOC容器形成父子关系,但它却形成了组合关系(IOC容器组合了整个总档案馆DefaultListableBeanFactory)
③. DefaultListableBeanFactory在Spring中扮演者至关重要的角色
⑥. AutowireCapableBeanFactory
- ①. 提供了自动装配能力,也就是BeanFactory还出了一个自动装配厂,这个自动装配厂只是扩展了一些功能
②. 所有的自动装配功能由AutowireCapableBeanFactory定义,但最终的实现是有很多来实现这个方法
③. AnnotationApplicationContext它自己没有自动装配能力,但是它组合了(DefaultListableBeanFactory)档案馆(它有自动装配能力),所以AnnotationApplicationContext也又有了自动装配能力。