springboot @ImportResource 加载(导入)外部xml配置文件

  • Post author:
  • Post category:其他


Spring提供了一个

@ImportResource

注释,用于将自定义的

applicationContext.xml

文件中的bean加载到Application Context中。

一、使用背景:

我们知道,传统的spring 一些 bean的信息(比如扫描配置,数据库配置等等)都是放在xml配置文件里面。然后启动服务的时候就通过导入这个配置文件完成spring容器的注入。

这种情况大多出现在对一些老旧项目进行改造的时候。

applicationContext.xml

配置如下:

二、需求



springboot 工程 导入外部 xml 文件,如  applicationContext.xml

通常情况下,如果目前的服务还是运行在自己搭建Tomcat中。导入只需要 @ImportResource 对应的配置文件。

然后将这些配置文件丢到 服务的 classpath  (WEB-INF\classes)即可,spring boot 配置如下:

@SpringBootApplication( scanBasePackages = {"com.common","com.common.exception"})
@ImportResource(locations = {"classpath:applicationContext-core.xml", "classpath:applicationContext-core-bigdata.xml"})
@Slf4j
public class BasicWebApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(BasicWebApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(BasicWebApplication.class);
    }

}

但是现在是以 jar 的形式启动,这就意味着 classpath  在jar文件的内部,显然,不可能将xml配置文件放到jar去(这样运维部署不能接受)。


所以必须要让服务启动时能加载到指定目录的xml配置文件。


三、改造

第一步:配置路径动态化

就是xml 文件我不管放在哪,都可以通过配置来进行指定,做法 是

@ImportResource(value = {"${core}", "${bigdata}"})

然后 application.yml 添加配置

core: file:f:\java\applicationContext-core.xml
bigdata: file:f:applicationContext-core-bigdata.xml

这里有个注意的点 就是如果路径前不加


file:


的话,那么就默认是classpath  的相对路径,不在classpath会加载不到,也就不能实现


真外部


。这个问题%99.99的博文都没有看到(可能大家都没用到)。


打包之后文件树(程序入口在lib里面, 启动脚本和配置都在外边)


四、总结

@ImportResource   不管是用  value =  还是 locations = 又或者是缺省。如果路径前面不加  file: 都是默认读取相对于 classpath  的路径

spring 很多配置都有这样的默认规则



版权声明:本文为zhan107876原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。