您的位置:首页 > 编程语言 > Java开发

跟我读Spring——Spring源码浅析(一)

2016-07-25 15:36 323 查看
我刚创建的群,欢迎加入



目录

目录
Spring核心类介绍
核心接口

核心实现者

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可以有层次结构,意思即是可以有parentBeanFactory

BeanFactory 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 注解元数据给外部。

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是一个耗费不大的操作。

SimpleAliasRegi
4000
stry

一个别名注册中心的简单实现,它同时是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-init

GenericBeanDefinition

一个一站式的(
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是一样的效果。

本文结束,概念介绍了这么多,下面的章节将读具体的代码逻辑了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring spring源码 java