先来两张图
1、顶层接口BeanFactory ,获取bean等
2、直接继承的有三个接口:
AutowireCapableBeanFactory:不太明白作用
HierarchicalBeanFactory:描述父工厂作用
ListableBeanFactory:提供了操作工厂所有bean信息方法
3、下面的继承关系可以分两条路线看:
第一条:DefaultListableBeanFactory
从继承,实现来看,这个类实现了上面一级的所有接口功能,这个类里有很多map用来存放,容器的掌管的东西
第二条:ApplicationContext
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver
对应它的实现类AbstractApplicationContext来看,
实现BeanFactory,ListableBeanFactory,HierarchicalBeanFactory方法都是使用了getBeanFactory()
获得一个ConfigurableListableBeanFactory调用对应方法
getBeanFactory是一个虚方法需要子类实现
实现Lifecycle接口,使用getLifecycleProcessor()得到一个LifecycleProcessor,内部有一个这样的属性,并且有
初始化方法protected void initLifecycleProcessor()
实现MessageSource,ResourcePatternResolver接口,也是类似
有点共性(什么设计模式),就是第一个类实现一个接口方法,具体实现时候,调用本类的一个属性(这个属性已经实现了)的对应方法。
refresh()方法
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
obtainFreshBeanFactory方法
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
子类实现的:refreshBeanFactory()
@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;
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
protected DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
在AbstractRefreshableApplicationContext中refreshBeanFactory()初始化this.beanFactory,getBeanFactory()返回this.beanFactory
refreshBeanFactory()中调用了protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法
来填充BeanDefinition
AbstractXmlApplicationContext中实现,是委托BeanDefinitionReader来做的
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// Create a new XmlBeanDefinitionReader for the given BeanFactory.
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
// Configure the bean definition reader with this context's
// resource loading environment.
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
// Allow a subclass to provide custom initialization of the reader,
// then proceed with actually loading the bean definitions.
initBeanDefinitionReader(beanDefinitionReader);
loadBeanDefinitions(beanDefinitionReader);
}
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
Resource[] configResources = getConfigResources();
if (configResources != null) {
reader.loadBeanDefinitions(configResources);
}
String[] configLocations = getConfigLocations();
if (configLocations != null) {
reader.loadBeanDefinitions(configLocations);
}
}
protected Resource[] getConfigResources() {
return null;
}
最后ClassPathXmlApplicationContext中
@Override
protected Resource[] getConfigResources() {
return this.configResources;
}
构造方法,初始化configResources,调用refresh初始化容器
public ClassPathXmlApplicationContext(String[] paths, Class clazz, ApplicationContext parent)
throws BeansException {
super(parent);
Assert.notNull(paths, "Path array must not be null");
Assert.notNull(clazz, "Class argument must not be null");
this.configResources = new Resource[paths.length];
for (int i = 0; i < paths.length; i++) {
this.configResources[i] = new ClassPathResource(paths[i], clazz);
}
refresh();
}