applicationContext接口的第二种实现类FileSystemXmlApplicationContext是基于磁盘路径读取配置文件并注入到Spring容器中的,和ClassPathXmlApplicationContext的实现方式类似。
整体代码如下:
java
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接口去实现的。
java
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并注入到容器内。