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% 的使用场景。

相关推荐
AI瓦力11 小时前
技术分享 | 彻底解决图片“躺平”问题:Java 后端强制校准图片方向
java
武子康11 小时前
Java-219 RocketMQ Spring Boot 集成指南:生产者与消费者实战
java·spring boot·分布式·kafka·消息队列·rocketmq·java-rocketmq
RainCityLucky11 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
小白|11 小时前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
weixin_5129761711 小时前
Java 面试宝典 Beta5.0
java
Ting-yu11 小时前
Spring AI Alibaba零基础速成(5) ---- Memory(记忆)
java·人工智能·后端·spring
月落归舟11 小时前
一文掌握Spring AOP:从入门到底层原理
java·后端·spring
QuZhengRong11 小时前
【Luck-Report】缓存
java·前端·后端·vue·excel
XiYang-DING11 小时前
【Spring】SpringMVC
java·后端·spring
想学习java初学者11 小时前
SpringBoot整合GS1编码解码
java·spring boot·后端