SpringBeanFactory类图详解
1.Spring BeanFactory ⼤致的类图:
⾸先看BeanFactory接⼝中定义的⽅法:
public interface BeanFactory {
//这⾥是对FactoryBean的转义定义,因为如果使⽤bean的名字检索FactoryBean得到的对象是⼯⼚⽣成的对象
String FACTORY_BEAN_PREFIX = "&";
//这⾥根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是⼀个⼤的抽象⼯⼚。
Object getBean(String name) throws BeansException;
//这⾥根据bean的名字和Class类型来得到bean实例,和上⾯的⽅法不同在于它会抛出异常:如果根据名字取得的bean实例的Class类型和需要的不同的话。
<T> T getBean(String name, Class<T> requiredType);
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, args) throws BeansException;
//这⾥提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);
//这⾥根据bean名字得到bean实例,并同时判断这个bean是不是单件
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//这⾥根据bean名字得到bean实例,并同时判断这个bean是不是原型
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
//这⾥对得到bean实例的Class类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//这⾥得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
然后在看BeanFactory 的直接继承接⼝(⼆级接⼝),有HierarchicalBeanFactory、AutowireCapableBeanFactory和ListableBeanFactory看这三个类代码:
HierarchicalBeanFactory
作⽤:是为了实现bean⼯⼚的层级关系提供⽀持,其中声明两个⽅法:
//得到⽗⼯⼚
BeanFactory getParentBeanFactory();
//在本地⼯⼚中有没有给定名称的bean,不包括继承的⼯⼚
boolean containsLocalBean(String name);
AutowireCapableBeanFactory
作⽤:提供⾃动装配bean能⼒的功能⽀持,声明⽅法如下:(这个接⼝中所有声明的⽅法都是在默认的实现在AbstractAutowireCapableBeanFactory 类中默认实现)
//⽤个给定的class类型制造⼀个完整的bean
<T> T createBean(Class<T> beanClass) throws BeansException;
//bean初始化完成之后执⾏回调函数和后处理器,
void autowireBean(Object existingBean) throws BeansException;
// ⾃动注⼊和设置bean的属性、执⾏factory回调函数⽐如setBeanName和setBeanFactory和执⾏bean的所有的后处理器
Object configureBean(Object existingBean, String beanName) throws BeansException;
//调⽤bean的init⽅法,这个⽅法是客户配置的,在bean实例化之后调⽤
Object initializeBean(Object existingBean, String beanName) throws BeansException;
//初始化完成之后应⽤后处理器
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
//应⽤前处理器
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName);
ListableBeanFactory
作⽤:可以枚举所有的bean实例,是为了使客户端访问⼯⼚中的bean⽽设计的,主要⽅法(这些⽅法顾名思义,所有的⽅法实现在StaticListableBeanFactory、AbstractApplicationContext和DefaultListableBeanFactory中)
//是否含有给定的名称的bean
boolean containsBeanDefinition(String beanName);
int getBeanDefinitionCount();
//得到⼯⼚所有的bean的名称数组
String[] getBeanDefinitionNames();
String[] getBeanNamesForType(Class<?> type);
//根据给定的类型得到和相应的策略得到所有的bean名称数组
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
//根据给定过的类型得到所有该类型的bean,返回的结果是⼀个Map<bean名称,bean对象>的形式
<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
//得到给定名称的bean上的给定注解类型的注解对象
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType);
ConfigurableBeanFactory
作⽤: 实现可配置的bean的环境功能,这个接⼝继承⾃HierarchicalBeanFactory所以⽀持层级关系的⼯⼚,和SingletonBeanRegistry 所以肯定⽀持单例⼯⼚⾏为,看主要⽅法代码(在AbstractBeanFactory类中默认实现)
void setConversionService(ConversionService conversionService);
void setTypeConverter(TypeConverter typeConverter);
/
/⽀持⾃定义bean的作⽤范围,可以理解为单例和多例之外的
void registerScope(String scopeName, Scope scope);
//归并的将给定的name的bean的定义
BeanDefinition getMergedBeanDefinition(String beanName);
//添加处理器
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
//下⾯是3个destory⽅法
void destroyBean(String beanName, Object beanInstance);
void destroyScopedBean(String beanName);
//只能销毁所有单例的bean,因为多例的是不归Spring控制的,是由客户端控制的
void destroySingletons();
ConfigurableListableBeanFactory
作⽤:提供可配置的、可访问的功能,接⼝中的⽅法在在DefaultListableBeanFactory默认实现默认实现。
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
//冻住之后bean定义就不能在被修改和进⾏任何的后处理器规定的操作
void freezeConfiguration();
//确保所有的单例bean都实例化
void preInstantiateSingletons() throws BeansException;
//
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//判断当前的bean是不是作为其它bean的依赖注⼊的
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor);
上⾯是接⼝的继承体系和说明,下⾯来介绍接⼝下抽象类的代码,在上⾯的介绍中我们知道就两个抽象类AbstractAutowireCapableBeanFactory和AbstractBeanFactory,先看继承关系:
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
implements AutowireCapableBeanFactory {
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
可以知道AbstractAutowireCapableBeanFactory 是AbstractBeanFactory 类的⼦类。通过上⾯的接⼝和抽象类的介绍我们将研究的重点转到转到这两个抽象类中。
这⾥我们主要看bean⼯⼚是怎么将xml中的定义信息转换为互相依赖的bean定义或者初始化为实体对象。
先看在继承体系偏上的类AbstractBeanFactory ,这个类最重要的是对BeanFactory中getBean()的实现,直接看实现的代码
………………
//⾸先从单例⼯⼚得到有没有
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
//不是但单例的
else {
//看是不是在⽗BeanFactory ,因为实现了HierarchicalBeanFactory接⼝
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
Bean(nameToLookup, requiredType);
}
……………………
if (mbd.isSingleton()) {//单例的
//⽤回调的形式建造bean并且放⼊单例⼯⼚
sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
public Object getObject() throws BeansException {
try {
return createBean(beanName, mbd, args);
}
……………………
/
/多例的
else if (mbd.isPrototype()) {
Object prototypeInstance = null;
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
………………
else {//没有明确是单例的还是不是,有⾃⼰的作⽤域scope
String scopeName = Scope();
final Scope scope = (scopeName);
Object scopedInstance = (beanName, new ObjectFactory<Object>() {
public Object getObject() throws BeansException {
return createBean(beanName, mbd, args);
……………………
可以上⾯是分为三种情况得到bean的,单例的、多例的、Scope的。但是所有的情况最终都定位到⼀个⽅法——createBean(beanName, mbd, args),这个⽅法在AbstractBeanFactory 是抽象的protected abstract Object createBean(,很明显,只能在⼦类中实现,⾃然就要看AbstractAutowireCapableBeanFactory 中的建造bean的createBean()代码:
protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
throws BeanCreationException {
………………
//如果没有到这个name的class类型是会抛出异常的
resolveBeanClass(mbd, beanName);
//判断在xml中定义的overrides⽅法存在
mbd.prepareMethodOverrides();
………………
//⽤bean的前处理器去实例化
Object bean = resolveBeforeInstantiation(beanName, mbd);
………………
Object beanInstance = doCreateBean(beanName, mbd, args);
………………
代码定位到doCreateBean(beanName, mbd, args)⽅法:
//逐渐的构造⼀个bean,分别⽤factory method, and autowiring a constructor.去构造,这些都是在xml中配置的。
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
………………
instanceWrapper = createBeanInstance(beanName, mbd, args);
………………
//构造bean并且注⼊依赖所有bean的属性值
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
//调⽤配置的init⽅法
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
代码定位到createBeanInstance(beanName, mbd, args)
//⽤ factory method, constructor autowiring, or simple instantiation.三种⽅法去实例化⼀个bean
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
………………
//⽤getFactoryMethodName去实例化⼀个
if (FactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
………………
//⽤构造函数
if (autowireNecessary) {
return autowireConstructor(beanName, mbd, null, null);
}else {
//⽤默认的构造函数得到
return instantiateBean(beanName, mbd);
}
………………
}
再定位代码到populateBean(beanName, mbd, instanceWrapper):
//主要是bean中的成员变量的初始化和注⼊,《依赖的注⼊》
protected void populateBean(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw) {
…
…………………
if (ResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// Add property values based on autowire by name if applicable.
if (ResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {spring ioc注解
autowireByName(beanName, mbd, bw, newPvs);
}
// Add property values based on autowire by type if applicable.
if (ResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
……………………
//将属性的引⽤和具体的对象结合起来,⽤到了java的反射机制
applyPropertyValues(beanName, mbd, bw, pvs);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论