通过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章学习;