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 很多配置都有这样的默认规则