一 IoC概念
IoC(Inverse of Control) 翻译为控制反转。所谓IoC,就是通过容器来控制业务对象之间的依赖关系,而非 传统的由代码直接控制。控制权由应用代码中转到了外部容器,控制权的转移,就是反转。控制权的转移带来的好处就是降低了业务对象之间的依赖程度。
二 BeanFactory
BeanFactory是Spring框架最核心的接口,一般称之为IoC容器
BeanFactory负责读取Bean配置文件,管理Bean 的加载并实例化,维护bean之间的依赖关系,负责bean的生命周期等功能
BeanFactory主要方法包括:
通过Bean的id获得一个业务对象实例
通过Bean的id和业务对象的类型获得一个实例
通过Bean的id和构造函数的入参获得一个业务对象实例,并且Bean必须设置scope="prototype",业务对象中也必须拥有与args数组中相同类型,相同个数的参数的构造函数
是否包含id为name的Bean
id为name的Bean是否每次返回同一个Bean实例,即是否设置scope="singleton"
id为name的Bean是否每次返回不同的Bean实例,即是非设置scope="prototype"
id为name的Bean返回实例的类型是否与targetType匹配
id为name的Bean返回实例的类型
id为name的Bean的所有别名
通过XmlBeanFactory实现类启动Spring IoC容器 ,如下代码所示:
XmlBeanFactory通过Resource装载Spring配置信息并启动IoC容器,然后通过getBean()从IoC容器中获取Bean了
三 ListableBeanFactory
主要是获取Bean的定义与配置信息相关的支撑接口,继承于BeanFactory
ListableBeanFactory的主要方法包括:
是否有符合给定beanName的Bean
boolean containsBeanDefinition(String beanName);
定义Bean的总数
int getBeanDefinitionCount();
所有Bean的name
String[] getBeanDefinitionNames();
所有符合对象类型的Bean的name
String[] getBeanNamesForType(Class type);
所有符合对象类型的Bean的name,可以指定是否单例,是否渴望初始化
String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean allowEagerInit);
所有符合对象类型的Bean的实例
Map getBeansOfType(Class type) throws BeansException;
所有符合对象类型的Bean的实例,可以指定是否单例,是否渴望初始化
Map getBeansOfType(Class type, boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
四 HierarchicalBeanFactory
顾名思义,该接口是定义BeanFactory分层的支撑,Hierarchical是分层的意思。继承于BeanFactory接口
HierarchicalBeanFactory的主要方法包括:
返回当前BeanFactory的parentBeanFactory
BeanFactory getParentBeanFactory();
在当前BeanFactory查找是否包含指定的bean,并不在parentBeanFactory中查找
boolean containsLocalBean(String name);
五 AutowireCapableBeanFactory
主要是Spring自动装配相关功能的支撑接口,继承于BeanFactory
AutowireCapableBeanFactory首先定义了5个自动装配的类型:AUTOWIRE_NO=0,AUTOWIRE_BY_NAME=1,
AUTOWIRE_BY_TYPE=2,AUTOWIRE_CONSTRUCTOR=3,AUTOWIRE_AUTODETECT=4,分别对应不自动装配、按名字、按类型、按构造器、按照自省完全自动装配(spring 3.0不支持了)
AutowireCapableBeanFactory的主要方法包括:
用给定的类型创建一个bean实例
Object createBean(Class beanClass) throws BeansException;
用给定的类型、给定的自动装配类型、是否检查依赖创建一个bean实例
Object createBean(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
个人理解是@AutoWired有关
void autowireBean(Object existingBean) throws BeansException;
配置原始Bean,就是把
existingBean自动装配到beanName对应的bean中
Object configureBean(Object existingBean, String beanName) throws BeansException;
解决beans之间的特定依赖,descriptor是依赖描述,beanName是描述当前依赖的bean的名字
Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;
实例化一个bean实例,通过bean的类型,自动装配类型以及是否检查依赖
Object autowire(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
对一个已存在的bean按照自动装配类型,是否检查依赖进行装配
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)throws BeansException;
beanName明确定义的属性的值会被自动装配到existingBean中
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
初始化bean,并调用工厂回调,并调用所有BeanPostProcessor的两个回调
Object initializeBean(Object existingBean, String beanName) throws BeansException;
在初始化前调用
BeanPostProcessor的两个回调
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException;
在初始化后调用
BeanPostProcessor的两个回调
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException;
Object resolveDependency(DependencyDescriptor descriptor, String beanName,
Set autowiredBeanNames, TypeConverter typeConverter) throws BeansException;