本章的内容根据SpringMVC源码剖析(二)- DispatcherServlet的初始化的相关内容,主要研究Spring IoC容器的初始化
从上图可以看出整个IoC容器主要分为2个部分:BeanFactory和ApplicationContext,接下来我们分别分析这两个接口
BeanFactory提供的是最基本的IoC容器的功能,我们对BeanFactory的类层级结构进行分析,如下源码
//IoC容器的核心接口,提供访问IoC容器的基本操作。
public interface BeanFactory {
//根据bean名称获取相应的bean对象. 此方法在AbstractBeanFactory骨架类中实现,
public Object getBean(String name) throws BeansException;
}
//定义分层的BeanFactory容器结构。
public interface HierarchicalBeanFactory extends BeanFactory {
}
//对BeanFactory提供配置信息.
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory {
void setParentBeanFactory(BeanFactory parentBeanFactory);
// 注册客户化属性编辑器.
void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor);
//添加BeanPostProcessor.
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
//销毁所有singleton类型bean对象.
void destroySingletons();
}
//主要逻辑有创建一个bean对象实例的过程,根据不同的WireMode(byName、byType)完成不同的操作。
public interface AutowireCapableBeanFactory extends BeanFactory {
//创建一个bean对象.
Object createBean(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
//配置一个bean对象.
Object configureBean(Object existingBean, String beanName) throws BeansException;
//初始化bean对象.
Object initializeBean(Object existingBean, String beanName) throws BeansException;
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
}
/*
*提供对BeanDefintion对象的管理操作。
*对通过BeanDefintionRegistry注册器注册到BeanFactory中的BeanDefintion对象进行管理,但注意此接口
*并不依赖于BeanDefintion接口API;
*此接口在操作上与BeanDefintionRegistry接口有重叠部分,但此接口的职责重在管理操作,而BeanDefintionRegistry重在注册操作,并且
*BeanDefintionRegistry接口直接依赖于BeanDefintion接口API。
*/
public interface ListableBeanFactory extends BeanFactory{
boolean containsBeanDefinition(String beanName);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
String[] getBeanNamesForType(Class type);
String[] getBeanNamesForType(Class type, boolean includePrototypes, boolean includeFactoryBeans);
Map getBeansOfType(Class type) throws BeansException;
Map getBeansOfType(Class type, boolean includePrototypes, boolean includeFactoryBeans) throws BeansException;
}
//
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory,SingletonBeanRegistry {
void ignoreDependencyType(Class type);
void ignoreDependencyInterface(Class ifc);
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//在容器启动过程中实例化singleton类型bean对象。
void preInstantiateSingletons() throws BeansException;
}
我们可以发现,最底层的子类都是XmlBeanFactory(现在已经被废弃了),该容器实现了其他诸如XML读取的附加功能,对于这些功能的实现原理,看一看XmlBeanFactory的代码实现就很容易理解,对我们理解IoC容器的原理很有帮助
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}
ApplicationContext建立在BeanFactory之上,除了能够提供容器的基本功能外,还增加了很多其他的功能,是一个高级形态意义的IoC容器。
1. 支持不同的信息源。ApplicationContext实现了MessageSource,可以支持国际化的实现
2. 访问资源。ApplicationContext实现了ResourceLoader,这样我们可以从不同地方得到Bean配置
3. 支持应用事件。ApplicationContext实现了ApplicationEventPublisher,从而在上下文中引入了事件机制
我们对ApplicationContext的层级结构进行分析:
//核心接口,为一个应用提供配置
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
String getDisplayName();
long getStartupDate();
}
//对容器对象进行配置化、初始化工作.
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle {
void setParent(ApplicationContext parent);
void addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor);
//此方法是核心方法,内部生成一个BeanFactory对象,并完成对BeanFactory对象的初始化和容器的初始化工作。
void refresh() throws BeansException, IllegalStateException;
ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
void close();
}
以上就是我对Spring容器接口设计的理解,Spring一个主要目标就是解耦,IoC容器就体现的淋漓尽致,它将不同功能定义成不同的类、接口,然后运用抽象、模板等方法通过继承、组合的方式定义新的类供开发人员使用。
转载请注明出处http://blog.csdn.net/qq418517226/article/details/42711067