给定一个内含bean定义的xml配置文件,我们来获取bean的定义和实例。
前提:不导入任何与spring相关的jar包

小剧场系列一:
Spring从零开始系列-第一弹:学习目标和基本介绍:听说,你快把我给忘记了...
本文:我不是,我没有,瞎说(:::з」∠)

首先第一步得先熟悉运行流程=搭好运行的骨架。

流程

    1. 在项目resource目录下建一个petStore.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="petStore" class="cn.shafish.service.v1.PetStoreService">
      </bean>
      </beans>

      可以看到其中定义了一个bean,id为petStore,对应类为cn.shafish.service.v1.PetStoreService,这些信息就是bean的定义

    1. 搭建获取bean定义/实例的骨架
      我们在test/java下新建一个beanFactory的测试类,用于获取需求 -- bean定义和实例。
      
      /**
  • 使用自定义的BeanFactoryTest类获取配置文件中的beand定义
    */
    public class BeanFactoryTest {
    @Test
    public void testGetBean() {
    //1.首先从xml配置文件中获取创建bean的工厂,BeanFactory和DefaultBeanFactory都是需要我们在项目中创建的
    BeanFactory beanFactory = new DefaultBeanFactory("petStore.xml");
    //2.从工厂中获取bean的定义
    BeanDefination defination = beanFactory.getBeanDefinition("petStore");
    //3.对比定义中的class是否相等,如果等则说明获取bean定义成功
    assertEquals("cn.shafish.service.v1.PetStoreService",defination.getBeanClassName());
    //4.获取xml中的bean实例,
    PetStoreService petStoreService = (PetStoreService)beanFactory.getBean("petStore");
    //5.判空看看该实例是否存在
    assertNotNull(petStoreService);
    }
    }
    
    使用断言之前得导入对应包`import static org.junit.Assert.*;`;
    上面就是从xml配置文件中获取一个bean的定义和实例的大致过程,里面的类、接口都是需要自定义的,接着看下一步
    1. 创建自定义类,补全使用到的方法
      第二步中用到的BeanFactoryDefaultBeanFactory,BeanDefination在不适用spring的情况下,要实现对应功能则都需要手动创建,来吧。
      BeanFactory对应的是接口,DefaultBeanFactory为实现的子类,BeanDefination为bean的定义信息。为了方便思路,我们用package分清一下:
      BeanFactory接口可以放在cn.shafish.beans.factory包下;
      DefaultBeanFactory实现类可以放在cn.shafish.beans.factory.support包下;
      BeanDefination 可以放在cn.shafish.beans下;
      而xml配置中用到的PetStoreService,则可以放在cn.shafish.service.v1.PetStoreService下。
      对应项目中目录如下:

      DefaultBeanFactory需要定义构造函数,BeanFactory 接口需要定义getBeanDefinitiongetBean,BeanDefination 需要定义getBeanClassName

这一步看着可能有点乱,但是按照分层思想会比较清晰,当然写的过程中可以暂时忽略,先做到不报错。

做完上面这三个步骤,我们的基本骨架就搭好了,继续gogogo

类的实现

首先实现DefaultBeanFactory

我们使用DefaultBeanFactory类来解析xml内容,选择dom4j这个包