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 -finishRefresh
Spring PostProcessor及IOC容器初始化流程
最新推荐文章于 2022-07-29 11:45:17 发布