说明

今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope、autowire、lazy-init、init-method、destroy-method等等。但还有很多很少用甚至没用过的标签,看来对这个经常使用的框架,还是知之甚少,本着探索的精神,决定将bean中所有相关标签的作用做一次整理,以便完善自己的知识体系。

另外,说明一下,使用的Spring源码版本为当前最新版本5.2.0.BUILD-SNAPSHOT,跟老版本中的相关代码可能会有少数差异。

Spring中对属性标签的解析

解析Spring中bean的属性标签的源码位置位于类:BeanDefinitionParserDelegateparseBeanDefinitionAttributes 方法中,源码如下:

  1. public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName,
  2. @Nullable BeanDefinition containingBean, AbstractBeanDefinition bd) {
  3. // 解析 singleton 属性,当前版本已不支持该属性,如使用将会抛出异常
  4. if (ele.hasAttribute(SINGLETON_ATTRIBUTE)) {
  5. error("Old 1.x 'singleton' attribute in use - upgrade to 'scope' declaration", ele);
  6. }
  7. // 解析 scope 属性
  8. else if (ele.hasAttribute(SCOPE_ATTRIBUTE)) {
  9. bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE));
  10. }
  11. else if (containingBean != null) {
  12. // 如果当前 bean 没有设置 scope 属性且当前 bean 是其他 bean 的内部 bean,则设置为其外部 bean 的 scope 属性值
  13. bd.setScope(containingBean.getScope());
  14. }
  15. // 解析 abstract 属性
  16. if (ele.hasAttribute(ABSTRACT_ATTRIBUTE)) {
  17. bd.setAbstract(TRUE_VALUE.equals(ele.getAttribute(ABSTRACT_ATTRIBUTE)));
  18. }
  19. // 解析 lazy-init 属性
  20. String lazyInit = ele.getAttribute(LAZY_INIT_ATTRIBUTE);
  21. if (isDefaultValue(lazyInit)) {
  22. lazyInit = this.defaults.getLazyInit();
  23. }
  24. bd.setLazyInit(TRUE_VALUE.equals(lazyInit));
  25. // 解析 autowire 属性
  26. String autowire = ele.getAttribute(AUTOWIRE_ATTRIBUTE);
  27. bd.setAutowireMode(getAutowireMode(autowire));
  28. // 解析 depends-on 属性
  29. if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) {
  30. String dependsOn = ele.getAttribute(DEPENDS_ON_ATTRIBUTE);
  31. bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS));
  32. }
  33. // 解析 autowire-candidate 属性
  34. String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
  35. if (isDefaultValue(autowireCandidate)) {
  36. String candidatePattern = this.defaults.getAutowireCandidates();
  37. if (candidatePattern != null) {
  38. String[] patterns = StringUtils.commaDelimitedListToStringArray(candidatePattern);
  39. bd.setAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName));
  40. }
  41. }
  42. else {
  43. bd.setAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));
  44. }
  45. // 解析 primary 属性
  46. if (ele.hasAttribute(PRIMARY_ATTRIBUTE)) {
  47. bd.setPrimary(TRUE_VALUE.equals(ele.getAttribute(PRIMARY_ATTRIBUTE)));
  48. }
  49. // 解析 init-method 属性
  50. if (ele.hasAttribute(INIT_METHOD_ATTRIBUTE)) {
  51. String initMethodName = ele.getAttribute(INIT_METHOD_ATTRIBUTE);
  52. bd.setInitMethodName(initMethodName);
  53. }
  54. else if (this.defaults.getInitMethod() != null) {
  55. // 如果没有设置该属性,则设置为默认值
  56. bd.setInitMethodName(this.defaults.getInitMethod());
  57. bd.setEnforceInitMethod(false);
  58. }
  59. // 解析 destroy-method 属性
  60. if (ele.hasAttribute(DESTROY_METHOD_ATTRIBUTE)) {
  61. String destroyMethodName = ele.getAttribute(DESTROY_METHOD_ATTRIBUTE);
  62. bd.setDestroyMethodName(destroyMethodName);
  63. }
  64. else if (this.defaults.getDestroyMethod() != null) {
  65. bd.setDestroyMethodName(this.defaults.getDestroyMethod());
  66. bd.setEnforceDestroyMethod(false);
  67. }
  68. // 解析 factory-method 属性
  69. if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) {
  70. bd.setFactoryMethodName(ele.getAttribute(FACTORY_METHOD_ATTRIBUTE));
  71. }
  72. // 解析 factory-bean 属性
  73. if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) {
  74. bd.setFactoryBeanName(ele.getAttribute(FACTORY_BEAN_ATTRIBUTE));
  75. }
  76. return bd;
  77. }

里面可以看到对 bean 标签中的很多属性进行了解析,接下来的几篇里,就来看看每个属性的作用。(第一个已经废弃的属性就不说了

【Spring源码解读】bean标签中的属性的更多相关文章

  1. 如何将spring源码导入到eclipse中

    如何将spring源码导入到eclipse中 1. 下载spring源码  可以在github官网中找到spring源码来下载,或者直接通过git下载,是一样的,这里演示 直接在github网站下载, ...

  2. Spring源码解读之BeanFactoryPostProcessor的处理

    前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...

  3. Spring源码学习——自定义标签

    2019独角兽企业重金招聘Python工程师标准>>> 1.自定义标签步骤 创建一个需要扩展的组件 定义xsd文件描述组件内容 创建一个文件,实现BeanDefinitionPars ...

  4. Spring源码解读Spring IOC原理

    一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们自己设计这样一个视角来考虑: 所谓控制反转,就是把原先我们代码里面需要实现的对象创建.依赖的代码,反 ...

  5. Spring源码系列 — Bean生命周期

    前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...

  6. Spring源码解读--(一)源码下载

    走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...

  7. Spring源码解读:核心类DefaultListableBeanFactory的继承体系

    1 简介 我们常用的ClassPathXmlApplicationContext是AbstractRefreshableApplicationContext的子类,而DefaultListableBe ...

  8. Spring源码之Bean生命周期

    https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...

  9. Spring源码 21 Bean生命周期

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

随机推荐

  1. python基础-字符串(6)

    一.引言 当打来浏览器登录某些网站的时候,需要输入密码,浏览器把密码传送到服务器后,服务器会对密码进行验证,其验证过程是把之前保存的密码与本次传递过去的密码进行对比,如果相等,那么就认为密码正确,否则 ...

  2. mysql 架构篇系列 1 复制原理和复制架构

    一. 复制概述 mysql 从3.23版本开始提供复制功能,复制是指将主数据库的ddl和dml操作通过二进制日志传到复制服务器(也叫从服务器)上,然后在从服务器上对这些日志重新执行(也叫重做),从而使 ...

  3. selenium python 一些操作和定位收集

    (—)滚动条操作 python中selenium操作下拉滚动条方法汇总 selenium_webdriver(python)控制浏览器滚动条 selenium+Python(select定位) Sel ...

  4. Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件

    在上一篇文章 Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板 中,我介绍了LuaFramework加载面板的方法,但这个方法并不适用于其它Prefab资源,在这套框 ...

  5. leetcode — minimum-window-substring

    import java.util.HashMap; import java.util.Map; /** * * Source : https://oj.leetcode.com/problems/mi ...

  6. 【Python】Python3纯代码极简教程

    #!/usr/bin/python3 ''' Python3.6.x简单教程  示例.注释  交互式和脚本式编程  变量类型  数字(Number)  字符串(String)  列表(Li ...

  7. 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  8. Spring基础系列-容器启动流程(2)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9503210.html 一.概述 这里是Springboot项目启动大概流程,区别于SSM ...

  9. iptables实战案例详解-技术流ken

    简介 关于iptables的介绍网上有很多的资料,大家可以自己找一些关于iptables的工作原理,以及四表五链的简介,对于学习iptables将会事半功倍.本博文将会例举几个工作中常用的iptabl ...

  10. Vue父组件传递异步获取的数据给子组件

    问题场景: 当父组件传给子组件的数据是在父组件中异步获取的时候,如何让子组件获取期望的值? 在父组件中: 首先在data()中定义data_detail为空: data(){ data_detail: ...