在 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% 的使用场景。
以上就是spring容器管理jar包内xml bean的5种方式的详细内容,更多关于spring管理jar包内xml bean的资料请关注代码网其它相关文章!
发表评论