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(例如XmlBeanDefinitionReader、AnnotatedBeanDefinitionReader) 结合使用。
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接口,它有多个实现类(如XmlWebApplicationContext、AnnotationConfigWebApplicationContext)。- 在 Spring Boot 应用中,通常不需要手动创建
WebApplicationContext,Spring Boot 会自动配置。 - Spring Boot 使用
SpringApplication类来启动应用,并自动加载配置文件:- 默认配置文件:
application.properties或application.yml(位于类路径根目录、config子目录、当前目录或当前目录的config子目录).application-{profile}.properties或application-{profile}.yml(特定 profile 的配置文件).
- 自定义配置文件:
- 可以使用
--spring.config.name和--spring.config.location命令行参数指定配置文件名和位置。 - 可以在代码中使用
@PropertySource注解加载额外的配置文件。 - 可以在
application.properties或application.yml中使用spring.config.import导入其他配置文件
- 可以使用
- 默认配置文件:
加载配置文件的底层原理:
ResourceLoader:ApplicationContext接口继承了ResourceLoader接口,可以使用ResourceLoader来加载各种资源,包括配置文件。Resource: Spring 使用Resource接口来表示资源(文件、类路径资源、URL 等)。BeanDefinitionReader:ApplicationContext使用BeanDefinitionReader来读取配置文件,并将其转换为BeanDefinition对象。XmlBeanDefinitionReader: 用于读取 XML 配置文件。AnnotatedBeanDefinitionReader: 用于注册带有注解的 Bean 类。ClassPathBeanDefinitionScanner: 用于扫描类路径并查找带有注解的 Bean 类。
总结:
ApplicationContext 提供了多种加载配置文件的方式,包括:
- 从类路径或文件系统加载 XML 配置文件 (
ClassPathXmlApplicationContext、FileSystemXmlApplicationContext)。 - 从 Java 配置类加载 Bean 定义或扫描带有注解的类 (
AnnotationConfigApplicationContext)。 - 使用
GenericApplicationContext手动注册 Bean 定义. - 在 Web 应用中,Spring Boot 会自动配置
WebApplicationContext并加载配置文件。
ApplicationContext 使用 ResourceLoader 加载资源,使用 BeanDefinitionReader 读取配置文件并将其转换为 BeanDefinition 对象。

3503

被折叠的 条评论
为什么被折叠?



