Spring源码分析(一)-Spring IoC容器的设计

本章的内容根据SpringMVC源码剖析(二)- DispatcherServlet的初始化的相关内容,主要研究Spring IoC容器的初始化

IoC容器的接口设计图

从上图可以看出整个IoC容器主要分为2个部分:BeanFactory和ApplicationContext,接下来我们分别分析这两个接口

BeanFactory

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);
    }

}
  1. 创建IoC配置文件的抽象资源Resource(applicationContext.xml)
  2. 创建一个载入BeanDefinition的读取器XmlBeanDefinitionReader,来载入XML文件形式的BeanDefinition
  3. 从定义好的资源位置Resource读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成,之后就可以直接使用IoC容器了(BeanFactoy.getBean)
    上述步骤也就是编程式使用IoC容器

ApplicationContext

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

你可能感兴趣的:(spring,源码)