(一)Spring核心-IoC容器的实现

1.IoC容器和依赖反转模式

(一)Spring核心-IoC容器的实现

如图:类A依赖类B和类C,类B依赖类C,在没有IoC容器的时候,需要类A和类B自己去创建所依赖类的实例,有了IoC容器后可以将这个职责交给IoC容器实现,由IoC容器创建类实例。

依赖反转模式也就是说把控制权从具体业务对象手中转交到平台或者框架中。所以,控制反转是关于一个对象如何获取它所依赖的对象的引用,反转指的是责任的反转。通过对使用IoC容器,对象依赖关系的管理反转了,转到IoC容器中来了,对象之间的相互依赖关系由IoC容器来管理,并由IoC容器完成对象的注入。这样就将散落在不同代码中的功能相同的部分集中成为容器的一部分。

2.IoC容器的设计与实现:BeanFactory和ApplicationContext

2.1Spring IoC容器系列

Spring IoC容器主要有两个系列,一个是实现BeanFactory接口的简单容器系列,这一系列的容器实现了容器的最基本的功能;另一个是ApplicationContext应用上下文,它是高级容器。Spring通过BeanDefinition来管理Spring中的各种对象和他们之间的依赖关系,BeanDefinition抽象了对Bean的定义,对于IoC容器来说,BeanDefiniton就是对依赖反转模式中管理对象依赖关系的数据抽象,依赖反转围绕着BeanDefinition的处理来完成。

2.2 Spring IoC容器的设计

(一)Spring核心-IoC容器的实现

如上图:有两条接口设计路线,一条是BeanFactory到HierarchicalBeanFactory再到ConfigurableBeanFactory,BeanFactory提供了IoC容器的基本方法,HierarchicalBeanFactory增加了getParentBeanFactory的功能,使BeanFactory具备了双亲IoC容器的管理功能,ConfigurableBeanFactory中定义了一些BeanFactory的配置功能,如通过addBeanPostProcessor配置Bean后置Bean处理器。

另一条是BeanFactory到ListableBeanFactory到ApplicationContext到WebApplicationContext或者ConfigurableApplicationContext

(1)BeanFactory提供了基本的IoC容器功能,源代码如下

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;

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);
}
2.BeanFactory容器设计原理

(一)Spring核心-IoC容器的实现

XmlFactoryBean的实现,它是一个可以读取以XML文件方式定义的BeanDefinition的IoC容器。

XmlFactoryBean的继承关系如下图:

(一)Spring核心-IoC容器的实现

public class XmlBeanFactory extends DefaultListableBeanFactory {
    private final XmlBeanDefinitionReader reader;

    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, (BeanFactory)null);
    }

    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader = new XmlBeanDefinitionReader(this);
        this.reader.loadBeanDefinitions(resource);
    }
}
编程式使用IoC容器

(一)Spring核心-IoC容器的实现

(3)ApplicationContext的应用场景

ApplicationContext的类继承关系如下图:

(一)Spring核心-IoC容器的实现

(4)ApplicationContext容器的设计原理

实例化应用上下文的支持,同时启动IoC容器的refresh()过程

(一)Spring核心-IoC容器的实现

从文件系统中加载XML的Bean定义资源

protected Resource getResourceByPath(String path) {
    if(path != null && path.startsWith("/")) {
        path = path.substring(1);
    }

    return new FileSystemResource(path);
}