spring Boot項目依賴jar包的處理及啟動問題
本文探討在spring boot應用中,服務A依賴服務B的jar包,并通過依賴注入的方式調用服務B方法時可能遇到的問題。假設服務A和服務B分別使用不同的數據庫。
場景描述:
服務A需要調用服務B的方法。通常,服務B會暴露REST接口,服務A通過遠程調用訪問。但本文考慮將服務B的jar包添加到服務A的pom.xml中,并在服務A中使用@Autowired注入服務B的Bean,直接調用服務B的方法。
代碼示例 (部分簡化):
服務A (AServer):
@RestController public class AServer { @Autowired LanguageMapper languageMapper; @Autowired Student student; @PostMapping("/language1") public List<CaffeineLanguageInfoDto> a() { List<CaffeineLanguageInfoDto> list = languageMapper.selectList(new QueryWrapper<CaffeineLanguageInfoDto>().eq("id", "301")); System.out.println(list); return list; } // ... other methods ... }
服務A 配置類:
@Configuration public class GenerateStudent { @Value("${123}") String age; @Bean public Student ges() { Student lm = new Student("李明"); lm.age = age; return lm; } }
服務B (BServer):
@RestController public class BServer { @Autowired AServer aServer; @PostMapping("/language1") public List<CaffeineLanguageInfoDto> test() { List<CaffeineLanguageInfoDto> list = aServer.a(); System.out.println(list); return list; } }
問題與解答:
-
只啟動服務A,能否正常啟動?
不一定。可能出現以下情況:
-
服務A啟動成功,服務B是否啟動?
不會。除非服務A顯式調用了服務B的啟動類main方法。
-
服務A調用服務B的方法時,使用哪個數據庫?
服務A調用服務B的方法時,使用的是服務A配置的數據庫信息。服務B的數據庫配置不會生效。
最佳實踐:
為了避免問題,建議將服務B的jar包作為工具類庫,只提供公共方法,避免依賴注入和數據庫訪問等操作。如果必須依賴配置,則提供默認值。 盡量避免在jar包中暴露REST接口,以減少沖突的可能性。 建議服務B只提供純計算或數據處理邏輯,不涉及數據庫操作或其他外部依賴。
補充說明:
原文中提到”resources目錄下的東西,b服務配置文件application.properties沒有生效,而mapper下的各個sql又生效了”,這可能是由于Spring Boot的自動配置機制導致的。Spring Boot會自動掃描resources目錄下的配置文件,但如果服務B的配置文件沒有被正確加載,則其配置不會生效。而Mapper文件通常由mybatis等框架管理,其加載機制與配置文件不同。
總而言之,將服務B作為依賴jar包引入服務A,并通過依賴注入的方式調用其方法,其行為與直接遠程調用服務B有本質區別。 需要謹慎處理依賴關系、配置和潛在的沖突,以確保應用的穩定性和正確性。