赞
踩
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 去获取配置文件的属性。
以这样的方式,有该配置项的服务可获取到值;无该配置项的服务也不会在启动时报错了。
如下图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。