ApplicationContext 如何加载配置文件的?

ApplicationContext 加载配置文件的方式取决于开发中使用的具体实现类以及提供的配置信息。以下是几种常见的 ApplicationContext 实现类及其加载配置文件的方式:

1. ClassPathXmlApplicationContext:

  • 加载方式: 从类路径 (classpath) 加载一个或多个 XML 配置文件。

  • 构造函数:

    • ClassPathXmlApplicationContext(String configLocation): 加载单个配置文件。
    • ClassPathXmlApplicationContext(String... configLocations): 加载多个配置文件。
    • ClassPathXmlApplicationContext(String[] configLocations, ApplicationContext parent): 加载多个配置文件,并指定父容器。
  • 示例:

    // 加载单个配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    // 加载多个配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml", "services.xml", "daos.xml");
    
    // 从包路径加载
    ApplicationContext context = new ClassPathXmlApplicationContext("com/example/config/applicationContext.xml");
    
    • 配置文件路径:
      • 可以是相对于类路径的路径(例如,"applicationContext.xml" 表示类路径根目录下的 applicationContext.xml 文件)。
      • 可以使用通配符(例如,"classpath*:com/example/**/*.xml" 表示类路径下 com/example 包及其子包中的所有 XML 文件)。
      • 可以是 classpath*: 前缀, 表示从所有 jar 包中加载.

2. FileSystemXmlApplicationContext:

  • 加载方式: 从文件系统加载一个或多个 XML 配置文件。

  • 构造函数:

    • FileSystemXmlApplicationContext(String configLocation): 加载单个配置文件。
    • FileSystemXmlApplicationContext(String... configLocations): 加载多个配置文件。
    • FileSystemXmlApplicationContext(String[] configLocations, ApplicationContext parent): 加载多个配置文件,并指定父容器。
  • 示例:

    // 加载单个配置文件
    ApplicationContext context = new FileSystemXmlApplicationContext("C:/config/applicationContext.xml");
    
    // 加载多个配置文件
    ApplicationContext context = new FileSystemXmlApplicationContext("/opt/config/beans.xml", "/opt/config/services.xml");
    
    // 使用相对路径 (相对于当前工作目录)
     ApplicationContext context = new FileSystemXmlApplicationContext("config/applicationContext.xml");
    
    • 配置文件路径:
      • 可以是绝对路径(例如,"C:/config/applicationContext.xml")。
      • 可以是相对路径(相对于当前工作目录)。

3. AnnotationConfigApplicationContext:

  • 加载方式: 从 Java 配置类加载 Bean 定义,也可以扫描带有注解的类。

  • 构造函数:

    • AnnotationConfigApplicationContext(): 创建一个空的容器,稍后可以手动注册配置类或扫描包。
    • AnnotationConfigApplicationContext(Class<?>... annotatedClasses): 注册一个或多个配置类。
    • AnnotationConfigApplicationContext(String... basePackages): 扫描一个或多个包及其子包,查找带有 @Component@Service@Repository@Controller@Configuration 等注解的类。
  • 示例:

    // 注册配置类
    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    
    // 扫描包
    ApplicationContext context = new AnnotationConfigApplicationContext("com.example");
    
    // 手动注册和刷新
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    context.register(AppConfig.class);
    context.scan("com.example");
    context.refresh();
    
    • 配置类: 使用 @Configuration 注解标注的类,其中可以使用 @Bean 注解定义 Bean。
    • 包扫描: 使用 @ComponentScan 注解(在配置类上)或 scan 方法(在 AnnotationConfigApplicationContext 上)指定要扫描的包。

4. GenericApplicationContext:

  • 这是一个通用的ApplicationContext实现,它本身不直接加载配置文件,而是提供了灵活的 API 来手动注册 Bean 定义。
  • 可以与其他 BeanDefinitionReader (例如 XmlBeanDefinitionReaderAnnotatedBeanDefinitionReader) 结合使用。
GenericApplicationContext context = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
xmlReader.loadBeanDefinitions("applicationContext.xml");

 AnnotatedBeanDefinitionReader annotationReader = new AnnotatedBeanDefinitionReader(context);
 annotationReader.register(AppConfig.class);

context.refresh(); // 刷新容器

5. WebApplicationContext (以及 Spring Boot):

  • WebApplicationContext 是用于 Web 应用的 ApplicationContext 接口,它有多个实现类(如 XmlWebApplicationContextAnnotationConfigWebApplicationContext)。
  • 在 Spring Boot 应用中,通常不需要手动创建 WebApplicationContext,Spring Boot 会自动配置。
  • Spring Boot 使用 SpringApplication 类来启动应用,并自动加载配置文件:
    • 默认配置文件:
      • application.propertiesapplication.yml (位于类路径根目录、config 子目录、当前目录或当前目录的 config 子目录).
      • application-{profile}.propertiesapplication-{profile}.yml (特定 profile 的配置文件).
    • 自定义配置文件:
      • 可以使用 --spring.config.name--spring.config.location 命令行参数指定配置文件名和位置。
      • 可以在代码中使用 @PropertySource 注解加载额外的配置文件。
      • 可以在 application.propertiesapplication.yml 中使用 spring.config.import 导入其他配置文件

加载配置文件的底层原理:

  • ResourceLoader ApplicationContext 接口继承了 ResourceLoader 接口,可以使用 ResourceLoader 来加载各种资源,包括配置文件。
  • Resource Spring 使用 Resource 接口来表示资源(文件、类路径资源、URL 等)。
  • BeanDefinitionReader ApplicationContext 使用 BeanDefinitionReader 来读取配置文件,并将其转换为 BeanDefinition 对象。
    • XmlBeanDefinitionReader: 用于读取 XML 配置文件。
    • AnnotatedBeanDefinitionReader: 用于注册带有注解的 Bean 类。
    • ClassPathBeanDefinitionScanner: 用于扫描类路径并查找带有注解的 Bean 类。

总结:

ApplicationContext 提供了多种加载配置文件的方式,包括:

  • 从类路径或文件系统加载 XML 配置文件 (ClassPathXmlApplicationContextFileSystemXmlApplicationContext)。
  • 从 Java 配置类加载 Bean 定义或扫描带有注解的类 (AnnotationConfigApplicationContext)。
  • 使用 GenericApplicationContext 手动注册 Bean 定义.
  • 在 Web 应用中,Spring Boot 会自动配置 WebApplicationContext 并加载配置文件。

ApplicationContext 使用 ResourceLoader 加载资源,使用 BeanDefinitionReader 读取配置文件并将其转换为 BeanDefinition 对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值