通过BeanDefinitionParserDelegate完成对资源文件的解析与载入,资源文件在IoC容器中创建了相应数据,但是这些数据还不能直接供IoC使用,需要在DefaultListableBeanFactory中进行注册;在31章图2中,这个类实现了BeanDefinitionRegistry接口,这个接口完成BeanDefinition向BeanFactory中注册;
在上章最后执行:
BeanDefinitionReaderUtils.registerBeanDefinition( BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException { String beanName = definitionHolder.getBeanName(); registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
调用DefaultListableBeanFactory.registerBeanDefinition()这个方法,完成注册;
@Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException { ... .... resetBeanDefinition(beanName); }
通过上面的方法完成BeanDefinition的注册,完成了refresh()的obtainFreshBeanFactory()方法,同时,DefaultListableBeanFactory中注册了整个bean的配置信息,所以这些配置信息就可以供IoC使用;
$3、依赖注入
在BeanFactory这个基本IOC容器中,定义了4个获取bean的方法getBean();下面来解析getBean的实现:
DefaultListableBeanFactory的基类AbstractBeanFactory.getBean()
@Override public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); } @Override public <T> T getBean(String name, Class<T> requiredType) throws BeansException { return doGetBean(name, requiredType, null, false); } @Override public Object getBean(String name, Object... args) throws BeansException { return doGetBean(name, null, args, false); } public <T> T getBean(String name, Class<T> requiredType, Object... args) throws BeansException { return doGetBean(name, requiredType, args, false); }
都调用了doGetBean方法,在doGetBean中会调用AbstractAutowireCapableBeanFactory.createBean-->doCreateBean-->createBeanInstance(beanName, mbd, args);populateBean(beanName, mbd, instanceWrapper);
createBeanInstance会根据传递进来class=“”的参数创建一个实例,populateBean将要注入的属性值给予赋值;
到这里 有必要对容器的创建、资源的定位、载入、注册(注入)、容器的销毁 梳理一下:
比如 ApplicationContext ac = new FileSystemXmlApplicationContext("e:/jsL/beans.xml");
1、首先会来到FileSystemXmlApplicationContext的构造方法中,并传递一个绝对资源文件地址;
super(null);
setConfigLocations(configLocations); //将文件地址赋值给configLocations这个属性
refresh();
2、执行refresh()这个方法会来到AbstractApplicationContext这个类中,这个类是FileSystemXmlApplicationContext的基类;
prepareRefresh(); //准备刷新,
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); //获得全新的beanFactory,调用loadBeanDefinitions()载入资源
(关键方法:refreshBeanFactory();loadBeanDefinitions(beanFactory);)
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isDebugEnabled()) { logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory); } return beanFactory; }
AbstractRefreshableApplicationContext @Override protected final void refreshBeanFactory() throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); //加载资源 synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; //替换了beanFactory; } } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } } @Override protected void cancelRefresh(BeansException ex) { synchronized (this.beanFactoryMonitor) { if (this.beanFactory != null) this.beanFactory.setSerializationId(null); } super.cancelRefresh(ex); } @Override protected final void closeBeanFactory() { synchronized (this.beanFactoryMonitor) { this.beanFactory.setSerializationId(null); this.beanFactory = null; } } protected final boolean hasBeanFactory() { synchronized (this.beanFactoryMonitor) { return (this.beanFactory != null); } } @Override public final ConfigurableListableBeanFactory getBeanFactory() { //获得新的beanFactory synchronized (this.beanFactoryMonitor) { if (this.beanFactory == null) { throw new IllegalStateException("BeanFactory not initialized or already closed - " + "call 'refresh' before accessing beans via the ApplicationContext"); } return this.beanFactory; } } @Override protected void assertBeanFactoryActive() { } protected DefaultListableBeanFactory createBeanFactory() { return new DefaultListableBeanFactory(getInternalParentBeanFactory()); } protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) { if (this.allowBeanDefinitionOverriding != null) { beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding); } if (this.allowCircularReferences != null) { beanFactory.setAllowCircularReferences(this.allowCircularReferences); } } protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException; }
prepareBeanFactory(beanFactory); //bean是ConfigurableListableBeanFactory的实例;
beanFactory.setBeanClassLoader(getClassLoader()); beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//配置标准容器特性,如类加载器,后置处理器:post-processors ,等
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
//将使用上一步添加的后置处理器。
registerBeanPostProcessors(beanFactory); //注册 后置处理器
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); } 找了老半天都没找到PostProcessorRegistrationDelegate在哪里声明的。
重点是loadBeanDefinitions(beanFactory)方法;结合第$2章学习;
相关推荐
《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从...
Spring技术内幕:深入解析Spring架构与设计原理 Spring是Java企业应用开发的主要框架之一,其架构和设计原理对Java开发者具有重要影响。本文将深入解析Spring架构和设计原理,对Spring的核心概念、架构设计和关键...
《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》这本书主要聚焦于Spring框架的核心架构和技术细节,帮助读者全面理解Spring的工作机制、设计理念以及实现方式。下面将根据书名及其描述来展开相关知识点。 ...
在深入解析Spring技术内幕第2版中,会详细探讨Spring框架的核心架构与设计原理,Spring作为一个轻量级的Java平台,提供了全面的编程和配置模型,是企业级Java应用程序开发中广泛使用的技术之一。 Spring的核心特性...
Spring技术内幕:深入解析Spring架构与设计原理 Spring技术内幕 Spring是一个基于Java的开源框架,旨在简化Java企业应用的开发。Spring的目标是提供一个简洁、灵活、可扩展的框架,以帮助开发者快速构建企业级...
SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析SPRING架构与设计原理SPRING技术内幕:深入解析...
Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...
Spring技术内幕 深入解析Spring架构与设计原理3(完整清晰版),你懂的。下载后请您回复支持一下。
本书从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透Spring框架的优秀架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇...
《深入解析Spring MVCgn Web Flow》还介绍了Spring 框架的设计模式,以及如何将同样的设计和技术应用到读者自己的代码中。 《深入解析Spring MVCgn Web Flow》适合各层次Spring Web 程序员阅读。 编辑推荐 《深入...
Spring技术内幕-深入解析Spring架构与设计原理.pdf
### Spring技术内幕与深入解析Spring架构与设计 #### 书籍概述 本书《Spring技术内幕+深入解析Spring架构与设计》是一本专为Spring框架开发者所撰写的深度技术指南。作者凭借超过十年的Java开发经验,从Spring 3.0...
Spring技术内幕:深入解析Spring架构与设计原理(第2部分) 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自执笔!Java开发者社区和Spring...
SPRING技术内幕__深入解析SPRING架构与设计原理,目前csdn上有多分,有的不好使,有的拆成很多分且下载分数很多,这是见过的一本不错的spring书籍,上传共享之、方便下载