1,分析BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor执行原理及时机;
接口BeanFactoryPostProcessor:beanFactory的后置处理器
-定义了方法postProcessBeanFactory
接口BeanDefinitionRegistryPostProcessor:bean定义的后置处理器
-定义了方法postProcessBeanDefinitionRegistry,
-继承了接口BeanFactoryPostProcessor
-定义了方法postProcessBeanFactory
BeanFactory:一个Bean工厂,getBean,到工厂中获取bean,就是到IOC的Map中拿Bean,拿得到就返回,拿不到就创建。
创建的方式有很多种,有反射,cglib,动态代理增强返回一个bean。
AnnotationConfigApplicationContext
-GenericApplicationContext
-AbstractApplicationContext
-ConfigurableApplicationContext
-ApplicationContext
-ListableBeanFactory,HierarchicalBeanFactory
-BeanFactory
-getBean(String name)
FactoryBean:工厂模式,要生产一个bean,调用getObject()方法返回一个bean就行了。
BeanFactoryPostProcessor
BeanPostProcessor
-initializeBean
-applyBeanPostProcessorsBeforeInitialization:调用前
-invokeInitMethods:bean初始化方法调用
-applyBeanPostProcessorsAfterInitialization:调用后
BeanDefinitionRegistryPostProcessor
RootBeanDefinition
1.1、BeanFactoryPostProcessor的执行时机
在容器创建的时候,会先创建BeanFactory,扫描所有的Bean定义信息,加载到BeanFactory中,然后才会去创建单实例的bean,调用构造方法。
1.2、BeanDefinitionRegistryPostProcessor的执行时机
测试结果发现,实现BeanDefinitionRegistryPostProcessor接口的类的方法的执行时机在实现BeanFactoryPostProcessor接口的类的方法的执行时间之前;
实现BeanDefinitionRegistryPostProcessor接口的类中的postProcessBeanDefinitionRegistry方法的执行时机在postProcessBeanFactory方法的执行时机之前。
1.3、分别的源码处理流程图如下所示:
2,IOC容器初始化从refresh到prepareBeanFactory()源码流程如下所示。
AnnotationConfigApplicationContext:容器
-refresh:创建刷新
-prepareRefresh:刷新前的预处理
-initPropertySources:初始化一些属性设置;默认为空,由子类实现;
-getEnvironment().validateRequiredProperties():校验相关属性的合法性
-this.earlyApplicationEvents = new LinkedHashSet<>():保存容器中的一些早期的事件
-obtainFreshBeanFactory:获取beanFactory实例
-refreshBeanFactory:刷新或创建beanFactory
-public GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory();} 构造方法创建子类
-getBeanFactory:将刚生成的beanFactory返回
-prepareBeanFactory:beanFactory预准备工作,(以上创建的beanFactory好多属性是没有值的,只有一些默认的值)
-beanFactory.setBeanClassLoader;设置beanFactory的类加载器
-beanFactory.setBeanExpressionResolver;设置beanFactory支持相关的表达式语言的解析
-beanFactory.addBeanPostProcessor;增加后置处理器
-beanFactory.ignoreDependencyInterface;设置忽略的自动装配接口
-EnvironmentAware
-EmbeddedValueResolverAware
-beanFactory.registerResolvableDependency;注册可以解析的自动装配;我们能直接在任何组件中自动注入
-BeanFactory
-ApplicationContext
-beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));添加监听检测的处理器
-if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME));注册环境变量相关的bean
-postProcessBeanFactory
-invokeBeanFactoryPostProcessors:调用BeanFactoryProcessor后置处理器
-invokeBeanFactoryPostProcessors
-postProcessBeanDefinitionRegistry:如果有BeanDefinitionRegistryPostProcessors的话优先处理BeanDefinitionPostProceesor
-postProcessBeanDefinitionRegistry
-JamesBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
-invokeBeanFactoryPostProcessors:处理BeanFactoryPostProcessors
-postProcessBeanFactory
-JamesBeanFactoryPostProcessor.postProcessBeanFactory
-registerBeanPostProcessors
-initMessageSource
-initApplicationEventMulticaster
-onRefresh
-registerListeners
-finishBeanFactoryInitialization
-finishRefresh1,分析BeanFactoryPostProcessor与BeanDefinitionR