Spring 拾枝杂谈—Spring原生容器结构剖析(通俗易懂)
目录
一、前言
- 开门见山,11.25日开始我们正式进入Java框架—Spring的学习,此前,up已经出过Java基础-->Java进阶-->MySQL-->JDBC-->JavaWeb的系列文章,大佬们可以进入我的主页,选择不同专栏进行阅读🌹🌹。对于这个新的系列,up准备和此前的JDBC系列一样,重点把内容讲清楚,说明白,以达到博文查漏补缺的本意,至于细枝末节,概所不录。
- 第一节内容,up主要和大家分享一下Spring原生容器结构,以及Spring入门案例。
- 关于注意事项,还是老规矩——①代码中的注释也很重要;②不要眼高手低,自己跟着过一遍才有收获;③点击文章的侧边栏目录或者文章开头的目录可以进行跳转。
- 良工不示人以朴,所有文章都会适时补充完善。大家如果有问题都可以在评论区进行交流或者私信up。感谢阅读!
二、Spring快速入门
1.简介 :
(1) 我们平时所说的Java框架"Spring"通常指的是"Spring Framework"。Spring本身作为一个框架,又可以整合其他的框架,即可以认为,Spring是管理其他框架的框架。
(2) Spring核心知识点——①IOC(Inversion of Control)控制反转,②AOP(Aspect Oriented Programming)面向切面编程,③JDBCTemplate,④声明式事务
(3) Spring5核心组件如下图所示 :
2. 入门实例 :
需求 : 使用Spring的方式获取JavaBean对象,并打印出该对象的信息。
首先,需要向Java项目中导入所需要的jar包,除commons-logging.jar外,其余都可在Spring的安装目录下的libs子目录中找到。如下图所示 :
接着,在src目录下创建beans.xml配置文件,创建流程如下图所示 :
若创建文件后,出现提示“Application context not configured for this file”,根据IDEA给出的提示操作即可。
接着,up在com.cyan.spring.bean包下新创建一个JavaBean类,以Student类为例,Student类代码如下 :
beans.xml代码如下 : (注意注释内容)
在test包下另定义一个测试类,用于获取到配置好的Student对象,并打印出该对象的信息。
StudentBeanTest类代码如下 :
运行结果 :
三、Spring容器结构分析
1.bean配置信息的存储 :
注意刚才的案例中有这么一行代码:
在Debug界面中,可以看到applicationContext对象的结构,beanFactory是该容器对象的一个非常重要的属性,如下图所示 :
在beanFactory属性下,可以找到它维护的beanDefinitionMap,是CurrentHashMap类型。如下所示 :
此处的Node是CurrentHashMap的一个静态内部类, 它与我们之前接触过的HashMap$Node类型以及Hashtable$Entry类型一样,都实现了Map接口内部的Entry接口,如下图所示 :
我们可以在table数组中,找到beans.xml文件中配置的对象的信息,如下图所示 :
可以看到,key就是我们为每一个bean元素配置的id属性;而在val中,首先我们可以看到保存的类的全类名,如下所示 :
此处的beanClass即保存了当前bean对应的class属性,即配置的类的正名(全类名)。
此外,我们还能在val中找到一个propertyValues属性,该属性保存了当前bean中的所有property子元素的值,如下所示 :
可以看到,居然出现了我们熟悉的ArrayList和elementData[],数组中的每一个元素,都对应一个bean的property属性,即对象的属性,如下图所示 : (eg : name = "Cyan")
2.bean对象的存储 :
在beanFactory属性下,除了方才的beanDefinitionMap,我们还可以找到一个重要的属性singletonObjects,如下图所示 :
可以看到,singletonObjects属性同方才的beanDefinitionMap属性一样,也是ConcurrentHashMap类型,并且它们都维护了一个ConcurrentHashMap$Node类型的数组table,我们仍然可以在table数组中找到配置的两个Student类对象,只不过它们这次是真的以"对象"形式来保存了(单例),如下图所示:
3.bean-id的快捷访问 :
仍然是在beanFactory属性下,除了方才的beanDefinitionMap和singletonObjects属性外,我们还要注意到beanDefinitionNames属性,如下图所示 :
这是Spring的设计者为了开发人员能够快捷地访问到Spring容器中保存的对象的id,专门把id保存在了该属性中,可以看到,它直接就用ArrayList来存储了。于是我们可以在elementData数组中,发现之前在beans.xml中配置的两个bean的id,如下图所示 :
我们可以通过applicationContext对象的getBeanDefinitionNames()方法来快速获取到当前Spring容器中所有的id。
代码演示如下 : (仍然在StudentBeanTest类中,新定义一个方法,通过引入JUnit框架进行单元测试)
运行结果 :
四、总结
🆗,以上就是Spring系列第一小节的全部内容了。
最后,我们可以用一张图总结一下Spring原生容器结构,如下图所示 :
System.out.println("END----------------------------------------------");
- 点赞
- 收藏
- 关注作者
评论(0)