spring容器管理jar包中bean的方式

Spring 容器管理 Jar 包内 XML Bean 的 5 种方式

在 Spring 项目中,Jar 包内的 XML 配置文件默认不会被 Spring 自动加载,需要手动指定加载路径,让容器扫描并管理其中的 Bean。

我给你整理了最常用、最实用的 5 种方式,按推荐程度排序,直接复制就能用。


方式 1:@ImportResource(最常用、最简单)

直接在启动类 / 配置类上注解,指定 Jar 包内 XML 的路径。

用法

java 复制代码
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。

xml 复制代码
<!-- 主配置文件中引入 jar 包内的 xml -->
<import resource="classpath*:service-context.xml"/>

方式 3:编程式手动加载(灵活、可控制加载时机)

通过代码手动创建、加载 XML 配置。

java 复制代码
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 的场景。

java 复制代码
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 注册:

ini 复制代码
org.springframework.context.ApplicationContextInitializer=com.xxx.XmlContextInitializer

方式 5:@Configuration + BeanDefinitionReader(最底层、最灵活)

手动解析 XML,注册 Bean。

java 复制代码
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 种)

  1. Spring Boot 项目首选 :@ImportResource("classpath*:xxx.xml")
  2. 传统 XML 项目 :<import resource="classpath*:xxx.xml"/>

这两种覆盖 99% 的使用场景。

相关推荐
Json____7 分钟前
基于 Spring Boot + Vue3 的在线考试管理系统实战
java·spring boot·后端·it学习·wwwoop.com
weixin_537590459 分钟前
《Spring快速入门到精通》- 实例1.1
java·spring·intellij-idea
jason成都17 分钟前
RTKLIB Java版:从C到Java的精密定位引擎,SPP/RTK/PPP/PPP-AR/PPP-RTK全栈实现
java·gnss·rtklib
Data_Journal19 分钟前
如何在 Java 中使用 Selenium 绕过 CAPTCHA
java
Sam_Deep_Thinking22 分钟前
如何理解java的信号量
java·后端·面试·程序员
晴空蓝天34 分钟前
MDC traceId 全链路日志追踪:Spring Boot 3.5 里把日志串成一条线
java·spring boot·后端·python
泡海椒40 分钟前
JQuick-Excel 项目定位与适用场景:声明式 Java Excel 的边界
java·开发语言·excel
AC赳赳老秦43 分钟前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度
java·汇编·c++·python·青少年编程·deepseek·openclaw
箓维1 小时前
线程的优缺点,与进程的关联和差异
java·服务器·笔记
曹牧1 小时前
Spring MVC:@RequestMapping
java·spring·mvc