前言:
上篇文章记录了spring工厂的概念和结构体系,且提到了 XmlBeanFactory 工厂。接下来详细学习这个底层的spring工厂。
此篇文章将介绍Resource接口和引出Spring IOC 工厂的核心内容
spring高级工厂和原始底层工厂读取配置文件的方式:
//高级工厂读取配置文件的方式:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ctx.getBean("u");
//原始底层工厂读取配置文件的方式:
//1. 读取XML配置文件,XML配置文件 封装 Java对象 ---> 创建工厂生产的对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
//2. 从工厂容器中获得对象
User user = (User) beanFactory.getBean("u");
ClassPathResource读取xml配置文件,源码:
此处只截取了核心的参数,看到如下三个参数,各位读者心中应该基本有个大概的认知。
public class ClassPathResource extends AbstractFileResolvingResource {
//文件路径
private final String path;
//类加载器
@Nullable
private ClassLoader classLoader;
//class类
@Nullable
private Class<?> clazz;
}
- Resource读取配置文件的方式:通过类加载器的方式获取输入流
- 此类实现了最核心的一个接口Resource。
Resource接口:
作用:读取相关资源文件的内容获得输入流,能读取的东西有:
- 文件 xml 、properties、txt等文件资源。
- 网络中的资源。
Resource接口还有个父接口:InputStreamSource
InputStreamSource接口有个方法getInputStream(),这个方法的作用是获取文件的输入流,无论是什么资源,我们需要关注的只是其输入流。
public interface InputStreamSource {
InputStream getInputStream() throws IOException;
}
此接口的子接口有如下:其中就有关于获取http资源的,file资源的,等等。
其中几个主要的子实现类有:
- FileSystemResource:通过文件系统获取输入流
- ClassPathResource:通过类获取输入流
- ByteArrayResource:通过字节数组获取输入流
- ServletContextResource :servlet上下文获取输入流
通过使用Resource对象,我们可以轻松地读取到我们在xml中配置的bean,并将其加载到JVM虚拟机中。最终,这些bean将被封装为BeanDefinition对象,以对象的形式在虚拟机中体现。
XmlBeanFactory工厂的核心内容:读取xml配置文件,创建对应的对象。
综上所述,无论通过哪种子实现类获取输入流,最终我们需要关注的只是这个输入流,我们只要读取这个输入流即可,就能封装我们想要的BeanDefinition对象。
Spring IOC 工厂部分的核心内容
XmlBeanFactory的使用:
//1. 通过Resource读取XML配置文件,XML配置文件 封装 Java对象 ---> 创建工厂生产的对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
//2. 从工厂容器中获得对象
User user = (User) beanFactory.getBean("u");
Spring IOC 的核心
使用XmlBeanFactory时的步骤以及一些细节,值得思考,如下:
- 第一步:通过Resource接口的实现类读取文件,获取一个InputStream输入流
- 问题:怎么读取配置文件 ,怎么获得IO资源 。
- 第二步:根据读取的输入流,用 XmlBeanDefinitionReader 这个类将输入流的数据封装成 BeanDefinition对象。这个对象包含所有关于创建bean对象时的配置信息。
- 问题:获取输入流后,如何在Spring中以对象的形式进行封装。
- 第三步:根据封装成的BeanDefinition对象,也就是根据配置信息创建真正的实例对象。
- 问题:如何根据BeanDefinition对象创建真正的实例对象。
- 第四步:完成所创建对象的生命周期 。
- 此对象的生命周期是怎样的。
如上这些值得思考的细节也就是 Spring IOC 的核心。