1. Spring IoC容器设计
Spring IoC容器设计主要是基于BeanFactory和ApplicationContenxt两个接口,其中ApplicationContext也是BeanFactory的子接口之一。BeanFactory是Spring IoC容器最底层的接口,ApplicationContext是其高级接口之一。
下面是BeanFactory的源码:
public abstract interface BeanFactory{
public static final String FACTORY_BEAN_PREFIX = "&";
public abstract Object getBean(String paramString)
throws BeansException;
public abstract <T> T getBean(String paramString, Class<T> paramClass)
throws BeansException;
public abstract <T> T getBean(Class<T> paramClass)
throws BeansException;
public abstract Object getBean(String paramString, Object[] paramArrayOfObject)
throws BeansException;
public abstract boolean containsBean(String paramString);
public abstract boolean isSingleton(String paramString)
throws NoSuchBeanDefinitionException;
public abstract boolean isPrototype(String paramString)
throws NoSuchBeanDefinitionException;
public abstract boolean isTypeMatch(String paramString, Class<?> paramClass)
throws NoSuchBeanDefinitionException;
public abstract Class<?> getType(String paramString)
throws NoSuchBeanDefinitionException;
public abstract String[] getAliases(String paramString);
}
- getBean的多个方法用于获取配置给Spring IoC容器的Bean,可以是字符串类型也可以说Class类型。但是由于Class类型可以扩展接口也可以继承父类,所以在一定程度上会出现使用父类类型无法准确地获取到实例的异常。
- isSingleton用于判断是否单例,如果判断为真,则该对象在容器中是以单例的形式存在的。isPrototype则相反,如果判断为真,意思是当你从容器中获取一个实例,容器就会为你生成一个新的实例。Spring IoC容器默认情况下是单例的,也就是isSingleton返回true,isPrototype返回false。
- type的匹配,是按Java类型匹配的方式
- getAliases是获取别名的方法。
2. Spring IoC容器的初始化和依赖注入
Bean的初始化和依赖注入是Spring Ioc容器初始化中的两大步骤
Bean的初始化分为3步:
(1)Resource定位,Spring Ioc容器根据开发者的配置(常见的XML和注解),进行资源定位。
(2)BeanDefinition的载入,Spring根据开发者的配置载入对应的POJO,用来生成实例的过程
(3)BeanDefinition的注册,这个步骤是吧之前通过BeanDefinition载入的POJO注册到Spring IoC容器中。后续就可以通过描述从Spring IoC容器中获取Bean了。
做完以上三步,Bean在Spring IoC容器中就得到了初始化,但还没有完成依赖注入,也就是没有注入其配置的资源给Bean,还不能完全使用。
对于依赖注入还有一个配置项是lazy-init,其含义是是否初始化Spring Bean。在没有任何配置的情况下,默认值为default,实际值为false,也就是容器会默认初始化Bean。如果设置为true,那么容器不会初始化Bean,而等到使用Spring IoC容器的getBean方法是才进行初始化,完成依赖注入。
3. Spring IoC容器的生命周期
可以在Spring IoC容器初始化到销毁的过程中加入自定义方法。如图是Spring IoC初始化和销毁Bean的过程:
图中生命周期的大部分接口,都是针对单个Bean而言的。BeanPostProcessor接口是针对所有Bean而言的。当一个Bean实现了上述接口,并在Spring IoC容器中注册,容器就会自动识别,并按图中的顺序执行。