Spring -- 源码分析 -- ClassPathXmlApplicationContext
2019-06-18 15:50
309 查看
1、基本情况
1、该类定义了资源文件数组,也就是需要解析的 xml 文件集合,使用的是 spring 独立封装的 resource 类,该类提供了多种读取资源的方式;然后调用 refresh 方法,进行容器的初始化
[code]setConfigLocations(configLocations); if (refresh) { refresh(); }
2、resource 读取
[code]ClassPathResource resource = new ClassPathResource("test.txt"); System.out.println("exists: "+resource.exists()); System.out.println("desc: "+resource.getDescription()); System.out.println("path: "+resource.getPath()); BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream())); System.out.println(reader.readLine());
3、refresh 过程
[code]//1.提供添加属性的重写方法, 并进行 environment 属性校验 prepareRefresh(); //2.使用 DefaultListableBeanFactory 进行 bean 的加载, 读取解析 xml 资源 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); //3.设置需要装配、不需要装配的接口,以及注册一些必要的 Bean prepareBeanFactory(beanFactory); //4.空实现, 供子类实现 postProcessBeanFactory(beanFactory); //5.调用 BeanFactoryPostProcessor, 这里可以对 BeanFactory 进行定制修改 invokeBeanFactoryPostProcessors(beanFactory); //6.将 BeanFactory 中所有的 BeanPostProcessors 注册进来 registerBeanPostProcessors(beanFactory); //7.国际化配置, messageSource initMessageSource(); //8.配置事件发布代理器 initApplicationEventMulticaster(); //9.空实现, 供子类实现 onRefresh(); //10.将所有的事件监听器, 加入到事件发布代理器中 registerListeners(); //11.提前初始化所有bean finishBeanFactoryInitialization(beanFactory); //12.初始化生命周期 lifecycleProcessor, 发布容器初始化完毕事件 finishRefresh();
4、步骤1:prepareRefresh
[code]this.startupDate = System.currentTimeMillis(); this.closed.set(false); this.active.set(true); //提供给子类重写, 用来加入需要进行验证的属性 initPropertySources(); getEnvironment().validateRequiredProperties();
5、步骤2:obtainFreshBeanFactory
[code]//容器初始化 refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); return beanFactory;
[code]//AbstractRefreshableApplicationContext.java 120行 if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } //1.创建的是 DefaultListableBeanFactory DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); //2.加载bean loadBeanDefinitions(beanFactory);
6、步骤3:prepareBeanFactory
[code]beanFactory.setBeanClassLoader(getClassLoader()); //1.设置 bean 解析器 beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); //2. beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); //3.在 bean 初始化之前, 注入 ApplicationContext 对象 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); //4.忽略装配的bean:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware beanFactory.ignoreDependencyInterface(EnvironmentAware.class); //5.设置需要的依赖:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); //6.注入environment、systemProperties、systemEnvironment if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); }
7、步骤4:postProcessBeanFactory,空实现,供子类实现
8、步骤5:invokeBeanFactoryPostProcessors
[code]//PostProcessorRegistrationDelegate.java 52行 //注册 BeanFactoryPostProcessor,分为 regular 和 registry 集合 //也就是 BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor //registry 类型的先执行 postProcessBeanDefinitionRegistry 方法 if (beanFactory instanceof BeanDefinitionRegistry) { for(...){ //1.自定义 BeanFactoryPostProcessor 分类 } //2.查询所有 BeanDefinitionRegistryPostProcessor 类型的 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); //3,4,5步骤中,先执行 postProcessBeanDefinitionRegistry 方法 for(...){ //3.筛选出 PriorityOrdered 类型,排序之后加入到 registry 集合中 } for(...){ //4.筛选出 Ordered 类型,排序之后加入到 registry 集合中 } for(...){ //5.筛选出 普通 类型,加入到 registry 集合中 } //6.执行 registry 类型的 postProcessBeanFactory 方法 invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory); //7.执行 regular 类型的 postProcessBeanFactory 方法 invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); }
9、步骤6:registerBeanPostProcessors
[code]//PostProcessorRegistrationDelegate.java 183行 //1.查找所有的 BeanPostProcessor 类型的bean String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); //2.按照 PriorityOrdered、Ordered、普通进行分类,排序 for(...){ if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { }else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { }else { } }
相关文章推荐
- Spring4源码分析(ClassPathXmlApplicationContext)
- 读spring源码(一)-ClassPathXmlApplicationContext-初始化
- Spring IOC 源码-ClassPathXmlApplicationContext-bean解析
- 读spring源码(三)-ClassPathXmlApplicationContext-getBean
- spring源码学习笔记-初始化(六) ClassPathXmlApplicationContext
- Spring 源码梳理(一) ClassPathXmlApplicationContext
- Spring 源码阅读-ClassPathXmlApplicationContext
- Spring ClassPathXmlApplicationContext和FileSystemXmlApplicationContext
- Spring ClassPathXmlApplicationContext和FileSystemXmlApplicationContext
- Spring ClassPathXmlApplicationContext和FileSystemXmlApplicationContext
- spring加载bean(ClassPathXmlApplicationContext和FileSystemXmlApplicationContext)
- Spring ClassPathXmlApplicationContext和FileSystemXmlApplicationContext读取配置文件的方法
- Spring中ClassPathXmlApplicationContext和ApplicationContext 的简单使用
- Spring源代码分析(8)---ClassPathXmlApplicationContext(工厂换新颜)
- Spring中ClassPathXmlApplicationContext的简述
- javaweb中spring出现parsing XML document from class path resource [applicationContext.xml]异常
- Spring的ClassPathXmlApplicationContext在Eclipse中的路径问题
- 【Spring学习笔记-2】Myeclipse下第一个Spring程序-通过ClassPathXmlApplicationContext加载配置文件
- [Spring]new ClassPathXmlApplicationContext("application.xml")做了些什么