给定一个内含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

类的实现

把上面第三步中用到的所有类(两个类一个接口)开始代码实现咯。
好了,这个时候你应该运行一下上面第二步骤的代码了,因为spring差不多就是这么用的。报错是肯定的,类里面都是空的,但是你点击的这一小步就是对应使用spring的最后一步。加油吧骚年