SpringBeanFactory类图详解

SpringBeanFactory类图详解

2023年7月26日发(作者:)

SpringBeanFactory类图详解 BeanFactory ⼤致的类图:⾸先看BeanFactory接⼝中定义的⽅法:public interface BeanFactory { //这⾥是对FactoryBean的转义定义,因为如果使⽤bean的名字检索FactoryBean得到的对象是⼯⼚⽣成的对象 String FACTORY_BEAN_PREFIX = "&"; //这⾥根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是⼀个⼤的抽象⼯⼚。

Object getBean(String name) throws BeansException; T getBean(String name, Class requiredType); T getBean(Class 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); //这⾥根据bean的名字和Class类型来得到bean实例,和上⾯的⽅法不同在于它会抛出异常:如果根据名字取得的bean实例的Class类型和需要的不同的话。然后在看BeanFactory 的直接继承接⼝(⼆级接⼝),有HierarchicalBeanFactory、AutowireCapableBeanFactory和ListableBeanFactory看这三个类代码:HierarchicalBeanFactory

作⽤:是为了实现bean⼯⼚的层级关系提供⽀持,其中声明两个⽅法://得到⽗⼯⼚BeanFactory getParentBeanFactory();//在本地⼯⼚中有没有给定名称的bean,不包括继承的⼯⼚boolean containsLocalBean(String name);AutowireCapableBeanFactory作⽤:提供⾃动装配bean能⼒的功能⽀持,声明⽅法如下:(这个接⼝中所有声明的⽅法都是在默认的实现在AbstractAutowireCapableBeanFactory类中默认实现)//⽤个给定的class类型制造⼀个完整的bean T createBean(Class 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中)//是否含有给定的名称的beanboolean containsBeanDefinition(String beanName);int getBeanDefinitionCount();//得到⼯⼚所有的bean的名称数组String[] getBeanDefinitionNames();String[] getBeanNamesForType(Class type);//根据给定的类型得到和相应的策略得到所有的bean名称数组String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean allowEagerInit);//根据给定过的类型得到所有该类型的bean,返回的结果是⼀个Map的形式 Map getBeansOfType(Class type) throws BeansException;//得到给定名称的bean上的给定注解类型的注解对象 A findAnnotationOnBean(String beanName, Class 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)) { return n(nameToLookup, requiredType); }…………………… if (leton()) {//单例的 //⽤回调的形式建造bean并且放⼊单例⼯⼚ sharedInstance = getSingleton(beanName, new ObjectFactory() { public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } …………………… //多例的 else if (otype()) { Object prototypeInstance = null; beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); ……………… else {//没有明确是单例的还是不是,有⾃⼰的作⽤域scope String scopeName = pe(); final Scope scope = (scopeName); Object scopedInstance = (beanName, new ObjectFactory() { 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⽅法存在 eMethodOverrides(); ……………… //⽤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.三种⽅法去实例化⼀个beanprotected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { ……………… //⽤getFactoryMethodName去实例化⼀个 if (toryMethodName() != 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 (olvedAutowireMode() == RE_BY_NAME ||

olvedAutowireMode() == RE_BY_TYPE) {

MutablePropertyValues newPvs = new MutablePropertyValues(pvs);

// Add property values based on autowire by name if applicable.

if (olvedAutowireMode() == RE_BY_NAME) {

autowireByName(beanName, mbd, bw, newPvs);

}

// Add property values based on autowire by type if applicable.

if (olvedAutowireMode() == RE_BY_TYPE) {

autowireByType(beanName, mbd, bw, newPvs);

}

pvs = newPvs;

}

…………………… //将属性的引⽤和具体的对象结合起来,⽤到了java的反射机制 applyPropertyValues(beanName, mbd, bw, pvs);}最后是applyPropertyValues(beanName, mbd, bw, pvs)protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) { try { //调⽤BeanWrapper类的⽅法 pertyValues(new MutablePropertyValues(deepCopy)); }这⾥补充⼀下BeanWrapperImpl类中设置属性依赖的代码实现:………………//如果有key属性配置,证明是array list 或者mapif ( != null) { if (ss().isArray()) { else if (propValue instanceof List) { else if (propValue instanceof Map) {}//普通的属性设置else{ ……………… essible(true); (object, value);}………………⾄此bean的如何初始化和如何进⾏依赖注⼊就已经研究代码完毕。

下⾯也是最后我们看⼀下这个继承体系中具体类XmlBeanFactory、DefaultListableBeanFactory的实现代码://这个类的实现很简单,只是委托XmlBeanDefinitionReader进⾏xml的读取和配置信息的加载public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); // 构造的时候就进⾏xml⽂件的解析 public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); anDefinitions(resource); }}DefaultListableBeanFactory是XmlBeanFactory的⽗类,也就是⽽你看下⽂章最前⾯的继承图,你会发现DefaultListableBeanFactory拥有这个继承体系中的所有功能。那么除了继承⽗类的功能⽅法外,它独特的功能在于对ConfigurableListableBeanFactory和ListableBeanFactory接⼝的实现。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690355831a337088.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信