SpringSpring容器通常是指ApplicationContext架构;即整个Spring框架的IOC功能是通过ApplicationContext接口的实现类为应用服务的,应用通过ApplicationContext的方法间接与Bean工厂进行交互,比如获取Bean对象的顶层接口ApplicationContext的实例如实例就是beanFactory;因此,Spring容器的本质也可以理解为一个bean工厂(beanFactory,即bean容器),根据我们的要求生产各种bean;在生产bean的过程中,为了解决bean之间的依赖问题,引入了依赖注入(DI)技术;也就是说,依赖注入是在beanFactory生产bean时解决bean之间依赖关系的一种技术。BeanDefinitionprotectedAbstractBeanDefinition(BeanDefinitionoriginal){setParentName(original.getParentName());setBeanClassName(original.getBeanClassName());setScope(original.getScope());setAbstract(original.isAbstract());setFactoryBeanName(original.getFactoryBeanName());setFactoryMethodName(original.getFactoryMethodName());setRole(original.getRole());setSource(original.getSource());copyAttributesFrom(原始);//这里省略}从源码中我们可以看出,BeanDefinition其实就是Bean的一些元数据定义,包括父类名称(parenName)、类名(baenClassName)、作用域(scope)等信息;通过BeanDefinitionReader获取BeanDefinition后,我们通过BeanDefinitionRegistry在BeanFactory中注册beanDefinition,并存储在BeanFactory的conCurrentHashMap中,key=beanName,Value=BeanDefinition;然后获取Bean,通过BeanName从conCurrentHashMap中获取对应的Bean信息。如果把bean比作一辆汽车,那么BeanDefinition就像是包含了组成这辆车的所有零件+设计手册+使用说明书等BeanDefinitionReaderBean元数据读取器(或者可以理解为解析器)BeanDefinitionReader会从中读取xml文件;@Component等注解类;@Configuration等配置类,获取BeanDefinition,然后注册到BeanFactory中;注意AnnotatedBeanDefinitionReader没有实现BeanDefinitionReader。这里的BeanDefinitionReader一般指的是元数据读取器BeanFactory,也就是bean工厂。一切启动的源头是在学习SpringBoot启动的过程中默认加载了context。DefaultListableBeanFactory,本文暂时不深究,以后有空再补全;DefaultListableBeanFactory是BeanFactory接口系统的默认实现类,提供BeanDefinition的存储映射和Bean对象的存储映射;Bean对象实例的存储映射定义在FactoryBeanRegistrySupport中,FactoryBeanRegistrySupport实现了SingletonBeanRegistry接口,DefaultListableBeanFactory的基类AbstractBeanFactory继承自FactoryBeanRegistrySupportBeanFactoryPostProcessorBeanFactoryPostProcessor是BeanFactory的后处理器。BeanFactory创建后,加载它包含的所有获取的BeanDefinitions,但是在实例化bean调用之前,执行,postProcessBeanFactory方法加载更多的bean元数据ConfigurationClassPostProcessor,用于从BeanFactory中检测带有@Configuration注解的类。对于这些类对应的BeanDefinitions集合,依次遍历交给ConfigurationClassParser和ConfigurationClassBeanDefinitionReader,同时处理@Configuration使用的其他注解和类内部使用@Bean注解生成BeanDefinition的方法,注册到BeanFactory处理bean元数据BeanDefinition属性填充&修改,在postProcessBeanFactory方法中,可以设置beanFactory中包含的beanDefinitions的propertyValues和propertyValues修改构造函数的参数值,比如使用PropertyPlaceHolderConfigurer填充赋值BeanDefinition的propertyValues的占位符,或者使用PropertyResourceConfigurer获取config文件中的属性,赋值或者覆盖BeanDefinitions的相关属性。BeanPostProcessorBeanPostProcessor是bean对象的后处理设备,负责处理创建的bean对象,主要是修改新创建的bean实例,提供类似hook的机制,修改创建的bean对象实例postProcessBeforeInitialization,创建bean实例,在任何初始化方法执行之前,执行方法postProcessAfterInitialization,创建一个bean实例,所有初始化方法执行完毕后执行该方法(未完成)参考:https://blog.csdn.net/u010013...https://blog.csdn.net/qq_3668...https://blog.csdn.net/weixin_...
