spring boot默认不加载applicationcontext.xml,需用@importresource显式引入;xml中无法直接读取application.properties变量,须配置context:property-placeholder;同名bean以@configuration类定义的为准,且2.4+版本禁用xml中的profile属性。

Spring Boot默认不加载applicationContext.xml
Spring Boot启动时默认只扫描@Configuration类和application.properties/application.yml,不会自动读取传统Spring的applicationContext.xml。如果你直接把XML丢进src/main/resources,它会被忽略——连报错都不会有,静默失效。
常见错误现象:BeanCreationException提示找不到某个XML里定义的bean,或者@Autowired失败但没线索;其实只是XML根本没被加载。
- 必须显式启用XML支持:在主启动类上加
@ImportResource("classpath:applicationContext.xml") - 路径必须准确:
classpath:前缀不能少,相对路径不生效;文件名大小写敏感(Windows下容易侥幸,Linux上线直接挂) - 如果XML里用了
context:property-placeholder,需确保spring-context依赖已引入(Spring Boot Starter Web默认包含,但Starter Data JPA等可能不带)
XML中引用application.properties变量要配PropertySourcesPlaceholderConfigurer
Spring Boot的application.properties不是自动注入到XML上下文里的。XML里写${my.db.url}会原样保留,运行时报IllegalArgumentException: Could not resolve placeholder。
解决办法不是改YAML,而是让XML“认得”Boot的环境配置:
- 在XML头部声明命名空间:
xmlns:context="http://www.springframework.org/schema/context",并加入对应xsi:schemaLocation - 添加
<property-placeholder location="classpath:application.properties"></property-placeholder>(注意:不能用file:协议,必须classpath:) - 若使用
application.yml,XML无法直接读取,得先通过@Configuration类暴露为PropertySource,再转给XML——不推荐,绕路且易错
@ImportResource和@Configuration混用时的Bean覆盖规则
XML里定义的bean和Java配置类里@Bean方法返回的同名bean,谁生效?答案是:后注册的覆盖先注册的。而Spring Boot中@Configuration类默认优先级高于@ImportResource。
这意味着:如果XML里定义了dataSource,但你的@Configuration类也写了@Bean DataSource dataSource(),后者会把前者顶掉——即使你没意识到。
- 检查Bean是否被覆盖:启动时加
--debug参数,看ConditionEvaluationReport里Overriding bean definition提示 - 强制XML优先:把
@ImportResource移到一个独立的、@Order(1)的@Configuration类里,再确保该类比其他配置类更早被扫描到(包路径更浅或用@ComponentScan显式控制) - 更稳妥的做法:XML只放遗留系统强依赖的Bean(如老版本JDBC驱动封装),新逻辑全走Java配置
Spring Boot 2.4+对XML支持的兼容性收紧
Spring Boot 2.4开始,默认禁用spring.profiles.active在XML中通过profile属性激活Bean(如<bean profile="dev"></bean>)。不是报错,而是直接跳过——XML里写的profile形同虚设。
原因:Boot把Profile管理完全收归Environment层,XML解析器不再参与Profile判断。
- 临时回退方案:在
application.properties里加spring.main.allow-bean-definition-overriding=true(仅限2.4.0~2.4.2,后续版本移除) - 长期解法:把
profile-条件逻辑迁出XML,改用@Profile注解或@ConditionalOnProperty控制Java配置类 - 验证是否生效:启动时加
--logging.level.org.springframework.beans.factory.xml=DEBUG,看日志里有没有Skipped XML bean definition相关输出
XML不是不能用,而是它和Spring Boot的自动配置体系天然存在两套生命周期管理逻辑。越想“两边都照顾”,越容易在Bean作用域、初始化顺序、Profile激活这些地方掉坑里。真要混合,就明确边界:XML管不可变的基础设施,Java配置管可变的业务逻辑。










