Spring IOC(一)体系结构
Spring IOC(一)体系结构
Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html)
BeanFactory 是Spring IOC 容器的鼻祖,是 IOC 容器的基础接口,所有的容器都是从它这里继承实现而来,可见其地位。BeanFactory 提供了最基本的 IOC 容器的功能,即所有的容器至少需要实现的标准。

一、BeanFactory
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
// 1. getBean
Object getBean(String name) throws BeansException;
<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;
// 2. @since 5.1
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
// 3. containsBean
boolean containsBean(String name);
// 4. 单例、多例。 bean 的生命周期
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
// 5. 匹配 bean 的 Class 类型或泛型(ResolvableType)
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
// 6. 其它属性
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
这些接口定义勾画出了 IOC 容器的基本方法特性。BeanFactory 功能如下:
- BeanFactory 是 Spring 容器的 Root Interface
- BeanFactory 持有 BeanDefinition,每一个 bean 都有独有的名字。BeanFactory 可以返回单例或多例的对象,取决于 Bean 定义文件。
- 可以通过 setters,constructors 进行依赖注入更好,其实这也是常用的方法。
- BeanFactory 通过载入配置源文件(XML 文件)的方式,来配置 Bean。
- BeanFactory 支持的 bean 生命周期的顺序。有以下接口:
- BeanNameAware#setBeanName
- BeanClassLoaderAware#setBeanClassLoader
- BeanFactoryAware#setBeanFactory
- ResourceLoaderAware#setResourceLoader
- ApplicationEventPublisherAware#setApplicationEventPublisher
- MessageSourceAware#setMessageSource
- ApplicationContextAware#setApplicationContext
- ServletContextAware#setServletContext
- BeanPostProcessors#postProcessBeforeInitialization
- InitializingBean#afterPropertiesSet
- a custom init-method definition
- BeanPostProcessors#postProcessAfterInitialization
- DisposableBean#destroy
- a custom destroy-method definition
BeanFactory 作为最顶层的一个接口类,它定义了 IOC 容器的基本功能规范,BeanFactory 有三个直接子类接口:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory,还有一个实现类 SimpleJndiBeanFactory。所以接下来依次分析三个子接口。
二、HierarchicalBeanFactory 可分层次 BeanFactory
从 HierarchicalBeanFactory 接口开始就有了父子工厂的概念。
public interface HierarchicalBeanFactory extends BeanFactory {
// 1. 获取父工厂
BeanFactory getParentBeanFactory();
// 2. 在当前工厂(不向上查找父工厂)中获取指定的 bean
boolean containsLocalBean(String name);
}
三、ListableBeanFactory 可枚举的 BeanFactory
从 ListableBeanFactory 接口开始可以枚举出本工厂生产的所有 bean 了。
public interface ListableBeanFactory extends BeanFactory {
// 1. 查找 BeanDefinition
boolean containsBeanDefinition(String beanName);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
// 2. 根据类型查找所有 bean 的名称,包括 FactoryBean
// includeNonSingletons=false 表示只取单例;
// allowEagerInit=true 表示立即加载,false 表示延迟加载。注意:FactoryBean 都是立刻加载的
String[] getBeanNamesForType(Class<?> type);
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons,
boolean allowEagerInit);
// 3. 根据类型查找所有 bean,返回 <beanName, bean>
<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
<T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons,
boolean allowEagerInit) throws BeansException;
// 4.1 根据类上的注解类型查找指定的 bean
String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
throws BeansException;
// 4.2 查找指定 bean 上的注解
<A extends Annotation> A findAnnotationOnBean(String beanName,
Class<A> annotationType) throws NoSuchBeanDefinitionException;
}
总结一下:
- 从这个工厂接口开始,可以枚举列出工厂可以生产的所有实例。即可以只查找 beanName,也可以查找对应的对象实例。
- 从这个工厂接口开始,BeanDefinition 登场了。
- 注意如果是一个层次继承的工厂,则只会列出当前工厂的实例,而不会列出祖先层的实例。
四、AutowireCapableBeanFactory 可自动装配的 BeanFactory
从 AutowireCapableBeanFactory 接口开始可以自动装配 bean 了。
AutowireCapableBeanFactory 直接继承自 BeanFacotory,它扩展了自动装配的功能,根据类定义 BeanDefinition 装配 Bean、执行后置处理器等。值得注意的是,这个接口并没有被 ApplicationContext 继承,因为应用程序几乎不用用到这些接口,当然也可以通过 ApplicationContext#getAutowireCapableBeanFactory() 获得这个 BeanFactory 实例。
public interface AutowireCapableBeanFactory extends BeanFactory {
// 1. 自动装配的模式,AUTOWIRE_AUTODETECT 已废弃
int AUTOWIRE_NO = 0;
int AUTOWIRE_BY_NAME = 1;
int AUTOWIRE_BY_TYPE = 2;
int AUTOWIRE_CONSTRUCTOR = 3;
int AUTOWIRE_AUTODETECT = 4;
//-------------------------------------------------------------------------
// Typical methods for creating and populating external bean instances
//-------------------------------------------------------------------------
// 2. 默认的方式创建、自动装配、配置 bean
<T> T createBean(Class<T> beanClass) throws BeansException;
void autowireBean(Object existingBean) throws BeansException;
Object configureBean(Object existingBean, String beanName) throws BeansException;
//-------------------------------------------------------------------------
// Specialized methods for fine-grained control over the bean lifecycle
//-------------------------------------------------------------------------
// 3. 根据给定的策略,创建、自动装配、配置 bean
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException;
// 4. bean 属性注入
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
// 5. bean 生命周期相关的初始化,如 BeanFactoryAware#setBeanFactory、InitializingBean#afterPropertiesSet
Object initializeBean(Object existingBean, String beanName) throws BeansException;
void destroyBean(Object existingBean);
// 6. 后置处理器 BeanPostProcessors 执行
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException;
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException;
// 7.
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
// 8. 属性注入时根据类型查找依赖,支持 List<BeanA> list 集合类型注入
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName)
throws BeansException;
Object resolveDependency(DependencyDescriptor descriptor, String beanName,
Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
}
总结一下:
首先几个属性,是装配策略:
AUTOWIRE_BY_NAME:把与 Bean 的属性具有相同的名字的其他 Bean 自动装配到这个属性上。举个例子就是:当有一个属性名字为 person 时,则自动装配策略选择 id 为 person 的 Bean 进行装配。AUTOWIRE_BY_TYPE:把与 Bean 的属性具有相同的类型的其他 Bean 自动装配到这个属性。AUTOWIRE_BY_CONSTRUCT:把与 bean 的构造器入参具有相同类型的其他 Bean 自动装配到 Bean 构造器的对应参数中。
还有两类方法,实际上工作中很少直接用这几个接口
- Typical methods for creating and populating external bean instances,该类是用来根据典型方法默认创建 Bean 和装配 Bean 的方法。
- Specialized methods for fine-grained control over the bean lifecycle,该类是用来根据装配策略细化装配,具体控制 Bean 生命周期的方法。
实现类为 AbstractAutowireCapableBeanFactory。还有两个配置的接口 ConfigurableBeanFactory 和 ConfigurableListableBeanFactory 也需要关注一下。
五、ConfigurableBeanFactory 配置 BeanFactory
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
String SCOPE_SINGLETON = "singleton";
String SCOPE_PROTOTYPE = "prototype";
// 1. 父工厂
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
// 2. ClassLoader
void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
ClassLoader getBeanClassLoader();
void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
ClassLoader getTempClassLoader();
// 3. 缓存
void setCacheBeanMetadata(boolean cacheBeanMetadata);
boolean isCacheBeanMetadata();
// 4. Spring el 表达式解析器
void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
BeanExpressionResolver getBeanExpressionResolver();
// 5.1 ConversionService 类型转换
void setConversionService(@Nullable ConversionService conversionService);
ConversionService getConversionService();
// 5.2 PropertyEditor 类型转换
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
// 5.3 类型转换
void setTypeConverter(TypeConverter typeConverter);
TypeConverter getTypeConverter();
// 6. ${key} 占位符解析
void addEmbeddedValueResolver(StringValueResolver valueResolver);
boolean hasEmbeddedValueResolver();
String resolveEmbeddedValue(String value);
// 7. 后置处理器
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
int getBeanPostProcessorCount();
// 8.
void registerScope(String scopeName, Scope scope);
String[] getRegisteredScopeNames();
Scope getRegisteredScope(String scopeName);
AccessControlContext getAccessControlContext();
// 9. copy 配置
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
// 10. bean 别名注册
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
void resolveAliases(StringValueResolver valueResolver);
// 11. BeanDefinition
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 12. FactoryBean
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
// 13. bean 创建状态
void setCurrentlyInCreation(String beanName, boolean inCreation);
boolean isCurrentlyInCreation(String beanName);
// 14. 注册依赖
void registerDependentBean(String beanName, String dependentBeanName);
String[] getDependentBeans(String beanName);
String[] getDependenciesForBean(String beanName);
// 15. 销毁 bean
void destroyBean(String beanName, Object beanInstance);
void destroyScopedBean(String beanName);
void destroySingletons();
}
实现类为 AbstractBeanFactory。
六、ConfigurableListableBeanFactory 集大成者
提供解析,修改 bean定义,并与初始化单例。
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
// 1. 忽略依赖检查,如 String/BeanFacory
void ignoreDependencyType(Class<?> type);
void ignoreDependencyInterface(Class<?> ifc);
// 2. 注册依赖关系
void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);
// 3. 依赖注入时查找是否是可以依赖的 bean
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
throws NoSuchBeanDefinitionException;
// 4. BeanDefinition 和 bean 遍历
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
Iterator<String> getBeanNamesIterator();
// 5. 清除不能缓存的 BeanDefinition,当 configurationFrozen=true 时可以缓存
void clearMetadataCache();
// 5.2 configurationFrozen=true 时缓存 BeanDefinition 信息
void freezeConfiguration();
boolean isConfigurationFrozen();
// 6. 实例化非懒加载的 bean
void preInstantiateSingletons() throws BeansException;
}
实现类为 DefaultListableBeanFactory。
此外 Spring BeanFactory 的实现还有三个重要的实现类,功能如下:
AbstractBeanFactory实现了 BeanFactory、 HierarchicalBeanFactory、ConfigurableBeanFactory 三个接口,最重要的方法是实现了 getBean(beanName) 接口,这个方法的最重要的步骤-创建 bean 则委托给模板方法 createBean 完成。AbstractAutowireCapableBeanFactory实现了 AutowireCapableBeanFactory 接口,也就是依赖注入。同时实现了 crcreateBean(beanName, mbd, args) 创建 bean 的三个重要过程:实例化(createBeanInstance)、依赖注入(populateBean)、初始化(initializeBean)。其中依赖注入又分为 autowireByName 和 autowireByType 二种,其中名称查找很简单,而类型查找就复杂了很多。Spring 将类型查找委托给了子类的 resolveDependency 完成。DefaultListableBeanFactory实现了 ConfigurableListableBeanFactory、BeanDefinitionRegistry 两个接口,提供了 Bean 和 BeanDefinition 查找注册的功能。 这个类一个很重要的功能是实现了模板方法 resolveDependency,这样就可以根据类型查找依赖。
每天用心记录一点点。内容也许不重要,但习惯很重要!
Spring IOC(一)体系结构的更多相关文章
- Spring之一:IoC容器体系结构
温故而知心. Spring IoC概述 常说spring的控制反转(依赖反转),看看维基百科的解释: 如果合作对象的引用或依赖关系的管理要由具体对象来完成,会导致代码的高度耦合和可测试性降低,这对复杂 ...
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
- 谈谈对Spring IOC的理解(转)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- spring ioc 源码解析
什么是ioc? 通俗的解释是:(spring)框架中,完成对象的创建和注入的容器. springIOC体系结构: spring IOC的创建是典型的工厂模式,这一系列的bean工厂如上所示. 其核心是 ...
- Spring:源码解读Spring IOC原理
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- 谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- Spring系列之谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 谈谈对Spring IOC的理解【转】
学习过Spring框架的人 一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大 ...
随机推荐
- express返回html文件
[express返回html文件] app.engine(ext, callback) 方法即可创建一个你自己的模板引擎.其中,ext 指的是文件扩展名.callback 是模板引擎的主函数,接受文件 ...
- python return 及lambda函数
return有两个作用: 1.用来返回函数的运行结果,或者调用另外一个函数.比如max()函数 >>> def fun(a,b): #返回函数结果. return max(a,b) ...
- apache服务器伪静态配置说明
apache服务器伪静态配置说明: 第一种 .如果是多城市版分类并且使用了城市二级域名即(多城市+多域名),请修改apache的配置文件,把以下代码添加到配置文件的最后一行即可,注意把qibosoft ...
- poj2492(带权并查集)
题目链接:http://poj.org/problem?id=2492 题意:给出n个人,m条关系,每条关系表示的两个人异性,判断这m条关系是否有误. 思路:带权并查集,类似poj1182,并查集的向 ...
- nodejs中.npmrc文件的内容
. nodejs安装后,使用npm安装模块的时候我出现了一个错误. getaddrinfo ENOTFOUND xxx 主要是这个配置文件的问题.搞不清楚.直接打开把文件内容删除变成 npmrc文件内 ...
- linux环境下的c++编程
就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样.Emacs, vi, eclipse, anjuta,kd ...
- CentOS查看进程、杀死进程、启动进程等常用命令
关键字: linux 查进程.杀进程.起进程 1.查进程 ps命令查找与进程相关的PID号: ps a 显示现行终端机下的所有程序,包括其他用户的程序. ps -A 显示所有程 ...
- stark组件之启动【模仿Django的admin】
首先需要在settings注册app INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib ...
- bs4.BeautifulSoup的基础用法
导入模块 from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc,"html.parser") 下面看下常见的用法 ...
- SpringBoot使用@Value从yml文件取值为空--注入静态变量
SpringBoot使用@Value从yml文件取值为空--注入静态变量 1.application.yml中配置内容如下: pcacmgr: publicCertFilePath: ...