ApplicationContext接口实现(二)

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并注入到容器内。

相关推荐
似水流年 光阴已逝7 小时前
从Excel姓名匹配案例学Python:由点及面的系统化学习指南
开发语言·python·excel
重生之我要当java大帝7 小时前
java微服务-尚医通-管理平台前端搭建-医院设置管理-4
java·开发语言·前端
以己之7 小时前
详解TCP(详细版)
java·网络·tcp/ip
LiuYaoheng7 小时前
【Android】布局优化:include、merge、ViewStub的使用及注意事项
android·java
Q_Q19632884757 小时前
python+vue的在线租房 房屋租赁系统
开发语言·vue.js·spring boot·python·django·flask·node.js
RealmElysia7 小时前
CoAlbum 引入ES
java·elasticsearch
せいしゅん青春之我8 小时前
[JavaEE初阶]网络协议-状态码
java·网络协议·http
shepherd1118 小时前
JDK源码深潜(一):从源码看透DelayQueue实现
java·后端·代码规范
天天摸鱼的java工程师8 小时前
SpringBoot + OAuth2 + Redis + MongoDB:八年 Java 开发教你做 “安全不泄露、权限不越界” 的 SaaS 多租户平台
java·后端
东巴图8 小时前
分解如何利用c++修复小程序的BUG
开发语言·c++·bug