上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefinition类封装后存放在并发容器ConcurrentHashMap中的,如下所示:

  1. /** Map of bean definition objects, keyed by bean name */
  2. private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);

下面来对BeanDefinition接口进行分析。

BeanDefinition

首先来看一幅图,BeanDefinition接口的UML类图关系:

可以看到BeanDefinition接口继承了两个接口,这两个接口均为祖宗级接口。AtributeAccessor位于spring-core包下,定义了属性的操作方式;BeanMetadataElement位于spring-beans包下,定义了获取元数据元素的配置源。其源码如下:

  1. package org.springframework.beans.factory.config;
  2. import org.springframework.beans.BeanMetadataElement;
  3. import org.springframework.beans.MutablePropertyValues;
  4. import org.springframework.core.AttributeAccessor;
  5. public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
  6. String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
  7. String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
  8. int ROLE_APPLICATION = 0;
  9. int ROLE_SUPPORT = 1;
  10. int ROLE_INFRASTRUCTURE = 2;
  11. void setParentName(String parentName);
  12. String getParentName();
  13. void setBeanClassName(String beanClassName);
  14. String getBeanClassName();
  15. void setScope(String scope);
  16. String getScope();
  17. void setLazyInit(boolean lazyInit);
  18. boolean isLazyInit();
  19. void setDependsOn(String... dependsOn);
  20. String[] getDependsOn();
  21. void setAutowireCandidate(boolean autowireCandidate);
  22. boolean isAutowireCandidate();
  23. void setPrimary(boolean primary);
  24. boolean isPrimary();
  25. void setFactoryBeanName(String factoryBeanName);
  26. String getFactoryBeanName();
  27. void setFactoryMethodName(String factoryMethodName);
  28. String getFactoryMethodName();
  29. ConstructorArgumentValues getConstructorArgumentValues();
  30. MutablePropertyValues getPropertyValues();
  31. boolean isSingleton();
  32. boolean isPrototype();
  33. boolean isAbstract();
  34. int getRole();
  35. String getDescription();
  36. String getResourceDescription();
  37. BeanDefinition getOriginatingBeanDefinition();
  38. }

考虑到篇幅限制,将源码中注释部分去掉。从接口名字即可大致知道该接口实现了哪些功能。

  • setParentName(String parentName)getParentName()可以设置获取该bean的父类bean
  • setBeanClassName(String beanClassName)getBeanClassName()可以设置获取该bean的别名
  • setLazyInit(boolean lazyInit)读取配置文件,设置该bean是否延迟加载;isLazyInit()判断该bean是否延迟加载
  • setDependsOn(String... dependsOn)设置bean的依赖项,String[] getDependsOn()获取依赖项
  • setFactoryBeanName(String factoryBeanName)设置该bean的加载工厂,String getFactoryBeanName()获取bean的加载工厂

通过对接口方法分析,可以发现BeanDefinition定义了bean实例的基础方法,基本上通过BeanDefinition接口就可以描述一个bean对象。也即表面在beanDefinitionMap中BeanDefinition接口可以替代Object对象存储bean实例。

既然两者都可以存储bean对象,为啥是用BeanDefinition而不是Object呢?其实细究可以发现:在Spring中,我们可以自定义是否延迟加载bean对象,合适初始化对象,要想实现加载、初始化时机控制,简单的通过Object对象是无法实现的,必须在此基础上有一个封装,这样才可以实现更多的自定义性质。所以在beanDefinitionMap中bean对象是以BeanDefinition形式存储。

本文介绍了Spring IOC容器中一个非常重要的接口BeanDefinition,以及解释了为啥beanDefinitionMap中存储的是BeanDefinition。下文将进入Spring IOC类加载的具体过程,重点看看默认的bean工厂DefaultListableBeanFactory

Spring IOC容器分析(2) -- BeanDefinition的更多相关文章

  1. Spring IOC容器分析(4) -- bean创建获取完整流程

    上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程. 测试环境创建 测试示例代码如下: package org.springframe ...

  2. Spring IOC容器分析(3) -- DefaultListableBeanFactory

    上一节介绍了封装bean对象的BeanDefinition接口.从前面小结对BeanFactory的介绍中,我们知道bean对象是存储在map中,通过调用getBean方法可以得到bean对象.在接口 ...

  3. Spring IOC容器分析(1) -- BeanFactory

    搭建好源码阅读环境后,就可以慢慢走进Spring殿堂了.IOC是Inversion of Control的缩写,控制反转的意思.很多人可能都知道IOC是spring的核心,将对象的创建初始化等权限交由 ...

  4. Spring Ioc 容器初始化过程

    IOC 是如何工作的? 通过 ApplicationContext 创建 Spring 容器,容器读取配置文件 "/beans.xml" 并管理定义的 Bean 实例对象.   通 ...

  5. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?

    阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...

  6. Spring源码分析:Spring IOC容器初始化

    概述: Spring 对于Java 开发来说,以及算得上非常基础并且核心的框架了,在有一定开发经验后,阅读源码能更好的提高我们的编码能力并且让我们对其更加理解.俗话说知己知彼,百战不殆.当你对Spri ...

  7. 【spring源码分析】spring ioc容器之前生今世--DefaultListableBeanFactory源码解读

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  8. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  9. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

随机推荐

  1. ArrayList , Vector 数组集合

    ArrayList 的一些认识: 非线程安全的动态数组(Array升级版),支持动态扩容 实现 List 接口.底层使用数组保存所有元素,其操作基本上是对数组的操作,允许null值 实现了 Randm ...

  2. Crayon 线段树或者树状数组

    Crayon Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus ...

  3. An Introduction to Variational Methods (5.2)

    我们现在已经得到了关于潜在变量Z的优化分布的表达形式: ‍ 其中: ‍ 所以现在我们可以得到Z的期望: ‍ 另外对于Z还值得一提的是,我们从其优化分布的表达式中可以看出,各个Z的组成部分之间还是相互耦 ...

  4. mysql error 1130 hy000:Host 'localhost' is not allowed to connect to this mysql server 解决方案

    ERROR 1130 (HY000): Host 'localhost' is not allowed to connect to this MySQL server D:\Wamp\mysql-\b ...

  5. ssi服务器端指令详解(shtml)

    你是否曾经或正在为如何能够在最短的时间内完成对一个包含上千个页面的网站的修改而苦恼?那么可以看一下本文的介绍,或许能够对你有所帮助. 什么是SSI? SSI是英文Server Side Include ...

  6. DevOps之存储和数据库

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <数据(Data)> 了解有关数据部分.涉及存储及数据库的概念:知识与技能的层次( ...

  7. win10 uwp 使用油墨输入

    win10可以很简单在我们的app使用自然输入,这篇文章主要翻译https://blogs.windows.com/buildingapps/2015/09/08/going-beyond-keybo ...

  8. Python学习笔记(九)

    Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...

  9. Traefik实现Kubernetes集群服务外部https访问

    转载请注明出处:http://www.cnblogs.com/wayneiscoming/p/7707942.html traefik 是一个前端http反向代理服务器以及负载均衡器,支持多种微服务后 ...

  10. 将摄像头的读入的人像放入背景视频中_with_OpenCV_in_Python

    import cv2 import numpy as np import time cap = cv2.VideoCapture(0) background_capture = cv2.VideoCa ...