目录
Spring核心类介绍
核心接口
我们要学习Spring的源码,首先要从抽象层开始入手,下面介绍几个核心的接口。
首先是Spring的类结构图:
BeanFactory
BeanFactory是Spring容器里最为重要的接口之一,这个接口作为访问Spring容器的根接口,定义为访问Spring Bean容器的基本的一个客户端视图。所有基于bean的操作都是基于这个接口来实现的,包括我们在J2EE开发中常用到的ApplicationContext接口也是从BeanFactory上继承而来的。子接口说明
ListableBeanFactory
此接口为BeanFactory的扩展接口,主要实现了容器中所有bean的遍历方法,避免一个接一个按名字查找bean来遍历。boolean containsBeanDefinition(String beanName); int getBeanDefinitionCount(); String[] getBeanDefinitionNames(); String[] getBeanNamesForType(Class<?> type); String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit); <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; //includeNonSingletons表示是否包含非singleton(单例)的bean //allowEagerInit表示是否为了内部的类型检查去初始化lazy-init的单例或由FactoryBean/factory-method等产生的bean,传递true会导致这些bean初始化。 <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException; <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType);
需要注意的是getBeansOfType和getBeanNamesForType都不支持内部类bean的获得。
HierarchicalBeanFactory
此接口标识了这个BeanFactory可以有层次结构,意思即是可以有parentBeanFactoryBeanFactory getParentBeanFactory(); //表示是否在当前的BeanFactory里有这个bean,不在父容器或祖先容器等寻找 boolean containsLocalBean(String name);
ConfigurableBeanFactory
此接口提供了一系列配置BeanFactory的方法,需要注意的是一般情况下这个类型不应被外部使用,外部使用一般有BeanFactory和ListableBeanFactory就可以了。这个类型是Spring框架内部所使用的类型。AutowireCapableBeanFactory
此接口提供了一系列可以自动装配bean的方法,提供了对现有的bean实例操作自动装配的入口。
这个接口不应当在一般的程序中使用,使用BeanFactory和ListableBeanFactory接口已经足够了。
里面有几个常量,让我们看看://不自动注入 int AUTOWIRE_NO = 0; //通过名称自动注入 int AUTOWIRE_BY_NAME = 1; //通过类型自动注入 int AUTOWIRE_BY_TYPE = 2; //通过构造器自动注入 int AUTOWIRE_CONSTRUCTOR = 3; //这个在spring3.0及以上版本已经废弃了,意思是自动推测。spring需要更明确的界定注入方式 @Deprecated int AUTOWIRE_AUTODETECT = 4;
- ConfigurableListableBeanFactory
此接口被大多数可列举的(listable)BeanFactory所实现。它提供了分析和修改BeanDefinition的工具,还有提供一个单例bean实例化的预操作入口(pre-instantiate)。
void preInstantiateSingletons() throws BeansException;
BeanDefinition
一个BeanDefinition代表了一个bean实例的一个描述,可能有自己的属性、构造器及更多根据具体实现者的信息。简单的说就是一个bean的描述元数据接口。里面提供了各种bean的可配置信息,与xml的配置相应。子接口说明
- AnnotationBeanDefinition
此接口只是BeanDefinition的扩展,为了暴露相关的AnnotationMetaData 注解元数据给外部。
- AnnotationBeanDefinition
BeanDefinitionRegistry
这个接口表示一个BeanDefinition的存储者,是读取解析配置文件成为BeanDefinition后,BeanDefinition的注册中心。这是在Spring里唯一的一个封装了BeanDefinition的注册方法的接口。
已知的实现者是DefaultListableBeanFactory 和 GenericApplicationContext。AliasRegistry
一个公共的接口表示Spring里别名的管理注册器。BeanFactory的默认实现者DefaultListableBeanFactory就是一个
别名注册中心(AliasRegistry)。AutowireCandidateResolver
确定一个bean是否有资格作为自动装配的候补者。
核心实现者
DefaultListableBeanFactory
Spring框架中默认实现的BeanFactory,ListableBeanFactory和BeanDefinitionRegistry的默认实现者。官方的定义是a full-fledged bean factory based on bean definition objects.
一个完全成熟的基于BeanDefinition对象的bean工厂。
主要用途是在访问bean之前注册所有的BeanDefinition(可能来自于bean的配置文件)。因此在本地表中查找BeanDefinition是一个耗费不大的操作。SimpleAliasRegistry
一个别名注册中心的简单实现,它同时是DefaultListableBeanFactory的祖先类DefaultSingletonBeanRegistry
一般的共享实例(单例)的bean注册中心,允许注册单例的bean实例。需要注意的是它同时提供了 DisposableBean的实现者bean的注册,可能这个DisposableBean的实现者并不是单例。它会根据一个合理的关闭顺序来注册bean的相关依赖。FactoryBeanRegistrySupport
此类是DefaultSingletonBeanRegistry的子类,主要功能是增加了FactoryBean的注册支持。AbstractBeanFactory
BeanFactory的最基本的抽象实现,此类提供了一个单例的缓存,同时也提供了管理BeanFactory的层次结构。主要的模板方法实现是getBeanDefinition和createBean,前者是通过一个给定的BeanDefinition的名称来得到一个BeanDefinition对象,而后者是通过一个BeanDefinition来创建这个bean的实例。RootBeanDefinition
一个根bean的定义,表示一个在Spring BeanFactory运行时合并特定的bean后的定义。它可能被创建为合并互相继承的一些原始的bean定义,一般这些原始的bean定义表示为GenericBeanDefinition。这个类在本质上是运行时标准的BeanDefinition的表示。ChildBeanDefinition
一个表示从父定义中继承而来的子Bean的定义。一个子bean定义将继承构造器参数值,属性值, 和方法的重载定义(MethodOverride),factory-method/init-method/destroy-method如果被定义了,子bean将覆盖父bean的定义。而剩下的这些属性是子bean自己的:depends-on, autowire, dependency-check, singleton, lazy-initGenericBeanDefinition
一个一站式的(one-stop
)bean定义类。通常来说,用这个类是为了把一个BeanDefinition暴露给用户,可能在post-processor
周期使用到,甚至可能改变它的一些属性。而使用RootBeanDefinition和ChildBeanDefinition是为了更明确的表示父子关系。BeanDefinitionHolder
一个BeanDefnition的存储器,主要是为了保存bean name和一个或多个别名之间的映射。- XmlBeanDefinitionReader
BeanDefinition的XML方式读取器,具体的操作委托给了BeanDefinitionDocumentReader - DefaultBeanDefinitionDocumentReader
读取spring-beans里bean定义的读取器,支持DTD和Schema。里面的定义结构属性等都是硬编码的。 - BeanDefinitionParserDelegate
用于parse bean定义的委托类,注意这个类是有状态的。 - ResourceLoader
一个加载Resource的策略接口定义,可能这个资源是classpath下的或者是文件系统里的。 XmlBeanFactory
DefaultListableBeanFactory的一个扩展,用于从xml文件里读取BeanDefinition。委托给了XmlBeanDefinitionReader,如果你用DefaultListableBeanFactory同时里面使用XmlBeanDefinitionReader是一样的效果。本文结束,概念介绍了这么多,下面的章节将读具体的代码逻辑了!