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
对象。