当前位置:   article > 正文

SpringBoot项目common模块中用到了Spring表达式导致的问题_springboot common模块

springboot common模块

【前置条件】

SpringBoot项目,项目分为十几个module,其中common是其中一个module,common模块用来存放常量类、枚举、工具类,以及所有的dao。

至于这里为什么要存放所有的dao,是因为项目并没有采用springcloud,无法做到服务间调用,所以为了让一些公共的接口不冗余,将dao层统一放在common模块中,各个服务各自注入common模块的dao从而各自实现service层。当然,各个服务的service层的冗余还是不可避免。

【问题描述】

项目开发中遇到问题,在A模块的配置文件application.yml中新增了一个配置项,该配置项以Spring表达式的方式用在了common模块中。

结果就会导致:引用了common模块的其他模块也识别到了该Spring表达式,导致启动报错,提示找不到该配置。

A模块application.yml的配置如下:

common模块中的Spring表达式如下:

更正一下:

假设有个其他模块--模块B。

并不是模块B引用了common模块,就会在启动报错。而是因为模块B的启动类中的@SpringBootApplication注解配置了scanBasePackages属性,该属性的值等于common模块的package。

模块B的启动类注解如下: (假设common模块的package路径就是com.aaa.bbb)

那为什么项目中要把其他模块的scanBasePackages 的值都配置成 common模块的package路径呢?

是因为要用到common模块中的dao对象。如果不配置成common模块的package路径,那就无法扫描到common模块中的dao,也就无法在各自模块中注入这些dao了。

所以才有了模块B在启动时会报错,如下图所示:

当然,如果模块B不需要用到common模块中的dao对象或者其他bean对象,那么模块B的@SpringBootApplication的属性scanBasePackage就不需要配置成common模块的package了。

这样的话,模块B在启动时也不会报错。因为模块B根本扫描不到common模块的package里。

Like this:

【解决方案】

当然肯定不能以 【在其他模块中都增加该配置项】的方式来解决,这样配置项就十分冗余了。

我们可以这样处理:在common模块中用到了该配置项的类,去实现 InitializingBean 接口,并重载该接口的 afterPropertiesSet() 方法,在该方法中用 Environment 去获取配置文件的属性。

以这样的方式,有该配置项的服务可获取到值;无该配置项的服务也不会在启动时报错了。

如下图所示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/137609
推荐阅读
相关标签
  

闽ICP备14008679号