applicationContext.xml 是 Spring 传统 XML 配置文件,用于定义 Bean 和容器行为,非必需;可通过 web.xml 配置 ContextLoaderListener 或 ClassPathXmlApplicationContext 显式加载,需注意路径前缀、命名空间及 schemaLocation 正确性。

它不是必须存在的文件,也不是 Spring 启动的唯一方式——只是传统 XML 配置模式下的一个约定名称。Spring 容器(ApplicationContext)可以通过它加载 Bean 定义、配置 AOP、事务、数据源等。现代项目多用 Java Config(@Configuration)或注解驱动(@ComponentScan),但遗留系统或特定集成场景仍常见该文件。
关键在初始化容器时显式指定路径,而不是依赖默认扫描。常见方式有:
web.xml 中通过 ContextLoaderListener 指定 contextConfigLocation 参数,例如:contextConfigLocation classpath:applicationContext.xml
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");注意路径前缀:classpath: 表示从类路径查找;file: 表示绝对/相对文件系统路径spring.main.web-application-type=none,再用 @ImportResource("classpath:applicationContext.xml")
它本质是 XML,遵循 Spring 的 XSD 约束(如 http://www.springframework.org/schema/beans)。典型结构包括命名空间声明、 定义、属性注入等。容易出问题的地方:
org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict
id 或 name 重复,引发 BeanDefinitionStoreException: Invalid bean definition
ref 引用未定义的 bean,运行时报 NoSuchBeanDefinitionException
constructor-arg 和 property:前者按参数顺序/类型匹配构造函数,后者调用 setter 方法;类型不匹配时不会报错但可能注入 null最小可用示例:
可以共存,但需明确启用对应支持。例如,在 applicationContext.xml 中必须显式开启注解处理:
才能识别 @Autowired、@Value 等 才能自动注册 @Service、@Repository 类为 Beancomponent-scan 又扫到同名类,默认会跳过(避免重复注册),除非设 use-default-filters="false"
真正麻烦的是调试——当一个 Bean 既在 XML 中定义,又被注解标记,又在 Java Config 中声明,最终生效的是最后注册的那个,而这个顺序取决于加载顺序,很难直观判断。