欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入理解Spring源码(第一部分):剖析一个测试用例示例

最编程 2024-02-22 17:27:55
...

本文及后续学习主要参考Spring5.0源码,《Spring源码深度解析》

背景

Spring在Java开发中是大家都会使用的开源框架,以我的使用经验来说Spring提供了一个容器管理,注解,常用组件的集成,事务等,但是今天有人问了我一个问题BeanFactory和FactoryBean的区别是什么,只能简单的回答出BeanFactory的一些使用上的理解,并不能很好的回答,所以也反思了下应该很早就学习Spring源码和ES源码,不过任何时候出发都不晚,所以开始啃Spring源码。

准备工作

我们可以从github上面拉取到Spring源码,然后本地执行gradle进行项目的编译,之前在公司一直编译失败,但是在家中就能编译成功,所以编译过程中出错也可能是网络原因。我就先按照源码解析一书中提到的开场一样先建立了一个xml文件(beanFactoryTest.xml),一个测试类(MyTestBean),以及一个测试方法类(BeanFactoryTest),如图所示:


image.png

xml配置bean文件是Spring最原始的方式,当然我们现在使用的SpringBoot已经通过注解简化了xml这种方式,不过SpringBoot也是基于Spring发展而来,所以我们还是先从最原始的学习。

测试用例

上面说到了我们创建的测试用例,我们这次就来分别看下这三个文件

  • MyTestBean
public class MyTestBean {

    private String testStr = "testStr";

    public String getTestStr() {
        return testStr;
    }

    public void setTestStr(String testStr) {
        this.testStr = testStr;
    }

}
  • beanFactoryTest.xml
<?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="myTestBean" class="MyTestBean"/>
</beans>
  • BeanFactoryTest
public class BeanFactoryTest {
    @Test
    public void testSimpleLoad(){
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));
        MyTestBean bean = (MyTestBean)beanFactory.getBean("myTestBean");
        Assert.assertEquals("testStr", bean.getTestStr());
    }

}

然后我们执行以下测试方法,看下执行的结果是啥?

image.png

我们可以看到测试代码成功根据配置文件中id获取到了对应的MyTestBean对象。这其实就是一个我们常说的简单的Ioc案例。以前我们获取MyTestBean对象都是通过new一个对象出来,但是案例中Spring通过xml配置获取到了MyTestBean对象,对象的控制权由用户反转给了Spring。下面就是我们需要去理解这个测试代码的过程从而进入Spring的源码世界。
测试代码执行中可能会报找不到org.apache.commons.logging.Log错误 解决办法就是在build.gradle文件configure(allprojects)节点的dependencies中compile("org.slf4j:jcl-over-slf4j:${log4jVersion}")就可以解决了