1 BeanFactory解析
Spring中Bean的创建是典型的工厂模式,这一系列的Bean工厂,即IoC容器,为开发者管理对象之间的依赖关系提供了很多便利和基础服务,在Spring中有许多IoC容器的实现供用户选择,其相互关系如下图所示。
其中,BeanFactory作为最顶层的一个接口,定义了IoC容器的基本功能规范,BeanFactory有三个重要的子接口:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。但是从类图中我们可以发现最终的默认实现类是DefaultListableBeanFactory,它实现了所有的接口。
那么为何要定义这么多层次的接口呢?
每个接口都有它的使用场合,主要是为了区分在Spring内部操作过程中对象的传递和转化,对对象的数据访问所做的限制。例如,
-
ListableBeanFactory接口表示这些Bean可列表化。
-
HierarchicalBeanFactory表示这些Bean 是有继承关系的,也就是每个 Bean 可能有父 Bean
-
AutowireCapableBeanFactory 接口定义Bean的自动装配规则。
这三个接口共同定义了Bean的集合、Bean之间的关系及Bean行为。最基本的IoC容器接口是BeanFactory,来看一下它的源码:
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
//根据bean的名称获取IOC容器中的的bean对象
Object getBean(String name throws BeansException;
//根据bean的名称获取IOC容器中的的bean对象,并指定获取到的bean对象的类型,这样我们使用时就不需要进行类型强转了
<T> T getBean(String name, Class<T> requiredType throws BeansException;
Object getBean(String name, Object... args throws BeansException;
<T> T getBean(Class<T> requiredType throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType;
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType;
//判断容器中是否包含指定名称的bean对象
boolean containsBean(String name;
//根据bean的名称判断是否是单例
boolean isSingleton(String name throws NoSuchBeanDefinitionException;
boolean isPrototype(String name throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name throws NoSuchBeanDefinitionException;
String[] getAliases(String name;
}
在BeanFactory里只对IoC容器的基本行为做了定义,根本不关心你的Bean是如何定义及怎样加载的。正如我们只关心能从工厂里得到什么产品,不关心工厂是怎么生产这些产品的。
BeanFactory有一个很重要的子接口,就是ApplicationContext接口,该接口主要来规范容器中的bean对象是非延时加载,即在创建容器对象的时候就对象bean进行初始化,并存储到一个容器中。
要知道工厂是如何产生对象的,我们需要看具体的IoC容器实现,Spring提供了许多IoC容器实现,比如: