spring源码深度解析—容器的基本实现,你知多少?

1. 概述分析源码是一件非常具有挑战性的工作 , 在正是分析spring的源码之前我们先来简单回顾下spring核心功能的简单使用
2. 容器的基本用法bean是spring最核心的东西 , spring就像是一个大水桶 , 而bean就是水桶中的水 , 水桶脱离了水也就没有什么用处了 , 我们简单看下bean的定义 , 代码如下:
public class MyBeanDemo { private String beanName = "bean"; public String getBeanName() { return beanName; } public void setBeanName(String beanName) { this.beanName = beanName; }}源码很简单 , bean没有特别之处 , spring的的目的就是让我们的bean成为一个纯粹的的POJO , 这就是spring追求的 , 接下来就是在配置文件中定义这个bean , 配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="demo" class="com.yhl.myspring.demo.bean.MyBeanDemo"> <property name="beanName" value=https://www.isolves.com/it/cxkf/kj/"bean demo1"/> 在上面的配置中我们可以看到bean的声明方式 , 在spring中的bean定义有N中属性 , 但是我们只要像上面这样简单的声明就可以使用了 。 
具体测试代码如下:
public class TestDemo { public static void main(String[] args) { BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-bean.xml")); try { MyBeanDemo bean = (MyBeanDemo)factory.getBean("demo"); System.out.println(bean.getBeanName()); } catch (BeansException e) { e.printStackTrace(); } }}运行上述测试代码就可以看到输出结果如下图: 

spring源码深度解析—容器的基本实现,你知多少?

文章插图
 
其实直接使用BeanFactory作为容器对于Spring的使用并不多见 , 因为企业级应用项目中大多会使用的是ApplicationContext(后面我们会讲两者的区别 , 这里只是测试)
3. 功能分析接下来我们分析2中代码完成的功能; 
- 读取配置文件spring-bean.xml 。 
- 根据spring-beanxml中的配置找到对应的类的配置 , 并实例化 。 
- 调用实例化后的实例 
下图是一个最简单spring功能架构 , 如果想完成我们预想的功能 , 至少需要3个类: 
spring源码深度解析—容器的基本实现,你知多少?

文章插图
 
其中 ,  
ConfigReader:用于读取及验证配置文件 。我们要用配置文件里面的东西 , 当然首先要做的就是读取 , 然后放置在内存中 。 
ReflectionUtil:用于根据配置文件中的配置进行反射实例化 。比如在例2.1中spring-bean.xml出现的 
我们就可以根据bean.demo进行实例化 。 
APP:用于完成整个逻辑的串联 。
4. 工程搭建在spring的源码中用于实现上面功能的是spring-bean这个工程 , 所以我们接下来看这个工程 , 当然spring-core是必须的 。
4.1 beans包的层级结构阅读源码最好的方式是跟着示例操作一遍 , 我们先看看beans工程的源码结构 , 如下图所示: 
spring源码深度解析—容器的基本实现,你知多少?

文章插图
 
- src/main/JAVA 用于展现Spring的主要逻辑 
- src/main/resources 用于存放系统的配置文件 
- src/test/java 用于对主要逻辑进行单元测试 
- src/test/resources 用于存放测试用的配置文件
4.2 核心类介绍接下来我们先了解下spring-bean最核心的两个类:DefaultListableBeanFactory和XmlBeanDefinitionReader 
4.2.1 DefaultListableBeanFactory 
XmlBeanFactory继承自DefaultListableBeanFactory , 而DefaultListableBeanFactory是整个bean加载的核心部分 , 是Spring注册及加载bean的默认实现 , 而对于XmlBeanFactory与DefaultListableBeanFactory不同的地方其实是在XmlBeanFactory中使用了自定义的XML读取器XmlBeanDefinitionReader , 实现了个性化的BeanDefinitionReader读取 , DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory并实现了ConfigurableListableBeanFactory以及BeanDefinitionRegistry接口 。以下是ConfigurableListableBeanFactory的层次结构图以下相关类图 ,  


推荐阅读