ApplicationContext接口实现(二)
applicationContext接口的第二种实现类FileSystemXmlApplicationContext是基于磁盘路径读取配置文件并注入到Spring容器中的,和ClassPathXmlApplicationContext的实现方式类似。
整体代码如下:
package com.example.springdemo.demos.a23;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;/*** @author zhou* @version 1.0* @description TODO* @date 2025/9/24 22:43*/
public class TestApplicationContect {private static final Logger log = LoggerFactory.getLogger(TestApplicationContect.class);public static void main(String[] args) {//testClassPathXmlApplicationContext();testFileSystemXmlApplicationContext();}public static void testClassPathXmlApplicationContext(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("a01.xml");for (String name : context.getBeanDefinitionNames()){System.out.println(name);}System.out.println(context.getBean(Bean2.class).getBean1());}public static void testFileSystemXmlApplicationContext(){FileSystemXmlApplicationContext context1 = new FileSystemXmlApplicationContext("D:\\javacode\\springDemo\\src\\main\\resources\\a01.xml");for (String name : context1.getBeanDefinitionNames()){System.out.println(name);}System.out.println(context1.getBean(Bean2.class).getBean1());}static class Bean1{}static class Bean2{private Bean1 bean1;public void setBean1(Bean1 bean1){this.bean1 = bean1;}public Bean1 getBean1(){return bean1;}}
}
输出结果:
上面的实现方式读取的是文件的绝对路径,也可以用相对路径的方式实现。
那么Spring内部这两个接口读取文件的原理是怎么样的的呢?其实它也是用到了我们之前讲的BeanFactory接口去实现的。
public static void main(String[] args) {//testClassPathXmlApplicationContext();//testFileSystemXmlApplicationContext();DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();System.out.println("读取之前....");for(String name : beanFactory.getBeanDefinitionNames()){System.out.println(name);}XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);reader.loadBeanDefinitions(new FileSystemResource("src\\main\\resources\\a01.xml"));System.out.println("读取之后");for(String name : beanFactory.getBeanDefinitionNames()){System.out.println(name);}}
打印结果:
可以看到Spring内部先通过XmlBeanDefinitionReader读取配置的Bean,使用beanFactory接口去定义Bean并注入到容器内。