跟我读Spring——Spring源码浅析(一)
2016-07-25 15:36
323 查看
我刚创建的群,欢迎加入
Spring核心类介绍
核心接口
核心实现者
首先是Spring的类结构图:
BeanFactory
BeanFactory是Spring容器里最为重要的接口之一,这个接口作为访问Spring容器的根接口,定义为访问Spring Bean容器的基本的一个客户端视图。所有基于bean的操作都是基于这个接口来实现的,包括我们在J2EE开发中常用到的ApplicationContext接口也是从BeanFactory上继承而来的。
子接口说明
ListableBeanFactory
此接口为BeanFactory的扩展接口,主要实现了容器中所有bean的遍历方法,避免一个接一个按名字查找bean来遍历。
需要注意的是getBeansOfType和getBeanNamesForType都不支持内部类bean的获得。
HierarchicalBeanFactory
此接口标识了这个BeanFactory可以有层次结构,意思即是可以有parentBeanFactory
ConfigurableBeanFactory
此接口提供了一系列配置BeanFactory的方法,需要注意的是一般情况下这个类型不应被外部使用,外部使用一般有BeanFactory和ListableBeanFactory就可以了。这个类型是Spring框架内部所使用的类型。
AutowireCapableBeanFactory
此接口提供了一系列可以自动装配bean的方法,提供了对现有的bean实例操作自动装配的入口。
这个接口不应当在一般的程序中使用,使用BeanFactory和ListableBeanFactory接口已经足够了。
里面有几个常量,让我们看看:
ConfigurableListableBeanFactory
此接口被大多数可列举的(listable)BeanFactory所实现。它提供了分析和修改BeanDefinition的工具,还有提供一个单例bean实例化的预操作入口(pre-instantiate)。
BeanDefinition
一个BeanDefinition代表了一个bean实例的一个描述,可能有自己的属性、构造器及更多根据具体实现者的信息。简单的说就是一个bean的描述元数据接口。里面提供了各种bean的可配置信息,与xml的配置相应。
子接口说明
AnnotationBeanDefinition
此接口只是BeanDefinition的扩展,为了暴露相关的AnnotationMetaData 注解元数据给外部。
BeanDefinitionRegistry
这个接口表示一个BeanDefinition的存储者,是读取解析配置文件成为BeanDefinition后,BeanDefinition的注册中心。这是在Spring里唯一的一个封装了BeanDefinition的注册方法的接口。
已知的实现者是DefaultListableBeanFactory 和 GenericApplicationContext。
AliasRegistry
一个公共的接口表示Spring里别名的管理注册器。BeanFactory的默认实现者DefaultListableBeanFactory就是一个
别名注册中心(AliasRegistry)。
AutowireCandidateResolver
确定一个bean是否有资格作为自动装配的候补者。
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
一个一站式的(
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核心类介绍
核心接口
我们要学习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是否有资格作为自动装配的候补者。
核心实现者
DefaultListableBeanFactorySpring框架中默认实现的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是一样的效果。
本文结束,概念介绍了这么多,下面的章节将读具体的代码逻辑了!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序