落樱小镇寿司屋2026
37.80M · 2026-03-30
在 Spring 项目中,Jar 包内的 XML 配置文件默认不会被 Spring 自动加载,需要手动指定加载路径,让容器扫描并管理其中的 Bean。
我给你整理了最常用、最实用的 5 种方式,按推荐程度排序,直接复制就能用。
@ImportResource(最常用、最简单)直接在启动类 / 配置类上注解,指定 Jar 包内 XML 的路径。
import org.springframework.context.annotation.ImportResource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// 加载 jar 包内的 xml,classpath*: 表示扫描所有依赖 jar 包
@ImportResource(locations = "classpath*:applicationContext-xxx.xml")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
classpath*: 必须加星号,才能扫描到 jar 包内的资源classpath*:spring/*.xmlapplicationContext.xml 中使用 <import>(传统 XML 项目)如果你的项目本身还是 XML 配置,直接在主 XML 里引入 Jar 包的 XML。
<!-- 主配置文件中引入 jar 包内的 xml -->
<import resource="classpath*:service-context.xml"/>
通过代码手动创建、加载 XML 配置。
import org.springframework.context.support.ClassPathXmlApplicationContext;
// 加载 jar 包内 xml,创建上下文
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("classpath*:bean-context.xml");
// 获取 bean
YourBean bean = context.getBean(YourBean.class);
ApplicationContextInitializer(Spring Boot 高级用法)适合需要在容器启动早期加载 XML 的场景。
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class XmlContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ClassPathXmlApplicationContext xmlContext =
new ClassPathXmlApplicationContext("classpath*:external-beans.xml");
// 将 jar 中的 bean 合并到主容器
applicationContext.setParent(xmlContext);
}
}
然后在 META-INF/spring.factories 注册:
org.springframework.context.ApplicationContextInitializer=com.xxx.XmlContextInitializer
@Configuration + BeanDefinitionReader(最底层、最灵活)手动解析 XML,注册 Bean。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.support.GenericApplicationContext;
@Configuration
public class XmlImportConfig {
@Bean
public void loadJarXml(GenericApplicationContext context) {
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
// 加载 jar 包内 xml
reader.loadBeanDefinitions("classpath*:dao-context.xml");
}
}
| 路径写法 | 作用 |
|---|---|
classpath:xxx.xml | 只加载当前项目的 xml,找不到 jar 包内的 |
classpath*:xxx.xml | 加载所有 jar 包 + 当前项目的 xml |
一定要用 classpath*:
@ImportResource("classpath*:xxx.xml")<import resource="classpath*:xxx.xml"/>这两种覆盖 99% 的使用场景。