Spring 容器管理 Jar 包内 XML Bean 的 5 种方式
在 Spring 项目中,Jar 包内的 XML 配置文件默认不会被 Spring 自动加载,需要手动指定加载路径,让容器扫描并管理其中的 Bean。
我给你整理了最常用、最实用的 5 种方式,按推荐程度排序,直接复制就能用。
方式 1:@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/*.xml
方式 2:applicationContext.xml 中使用 <import>(传统 XML 项目)
如果你的项目本身还是 XML 配置,直接在主 XML 里引入 Jar 包的 XML。
<!-- 主配置文件中引入 jar 包内的 xml -->
<import resource="classpath*:service-context.xml"/>
方式 3:编程式手动加载(灵活、可控制加载时机)
通过代码手动创建、加载 XML 配置。
import org.springframework.context.support.ClassPathXmlApplicationContext;
// 加载 jar 包内 xml,创建上下文
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("classpath*:bean-context.xml");
// 获取 bean
YourBean bean = context.getBean(YourBean.class);
方式 4:自定义 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
方式 5:@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*:
总结(最实用的 2 种)
- Spring Boot 项目首选:
@ImportResource("classpath*:xxx.xml") - 传统 XML 项目:
<import resource="classpath*:xxx.xml"/>
这两种覆盖 99% 的使用场景。