参考的文章
正文
- 我对于Spring IOC(控制反转)的理解,是将对象的管理(控制)权从以前的程序员手中“反转”到了Spring IOC容器手中。
- Spring IOC容器的定义接口(最基本的IOC容器):BeanFactory,这个借口为具体的IOC容器的实现做了最基本的功能规定。
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
- 围绕着BeanFactory,pring对于IOC容器有许多种实现(XmlBeanFactory,XmlWebApplicationContext.java,ClassPathXmlApplicationContext.java FileSystemXmlApplicationContext.java)。
- 我是以ClassPathXmlApplicationContext.java为例去看的源码。
ClassPathXmlApplicationContext构造器代码
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
super(parent);
this.setConfigLocations(configLocations);
if(refresh) {
this.refresh();
}
}
- 主要是调用了refresh()方法。bean的初始化逻辑是在这里完成的。
refresh()方法(refresh方法是在AbstractApplicationContext里的)
public void refresh() throws BeansException, IllegalStateException {
Object var1 = this.startupShutdownMonitor;
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var9) {
if(this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
- 这里重要的是
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
,获取一个新的beanFactory
obtainFreshBeanFactory()
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
this.refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
if(this.logger.isDebugEnabled()) {
this.logger.debug("Bean factory for " + this.getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
this.refreshBeanFactory();
刷新beanFactory,如果已经建立了那么应该销毁重建。该方法是一个abstract方法,通过调试发现调用的是AbstractRefreshableApplicationContext
中实现的refreshBeanFactory方法
refreshBeanFact