Java跨模块调用方式
作者:animatelife
这篇文章主要介绍了Java跨模块调用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Java常见的调用其他类或包的方法
- Spring IoC
- SPI
- Listener/Callback
- EventBus(类比Guava的事件总线)
Spring IoC
- 将所有类的实例的生成和管理都交由第三方,调用方从第三方拿到被调用方的实例,从而实现调用
SPI
- SPI即Service Provider Interface,调用方只有包含该方法的接口,需要调用方自己将获取到的接口实现类实例注入到容器中,再从容器中取出调用
- 使用SPI的示例:JDK自带的ServiceLoader.loader、Dubbo等
Listener/Callback
- Listener是一个集合,子模块A将要使用的方法所在接口的实例放在这个集合中,子模块B将这些接口的实现类塞进这个集合中,A要使用的时候就会看这个Listener集合具体哪些接口有实现,再通过接口的方式去调用
- 使用Listener/Callback的示例:常见的各种GUI、事件处理
EventBus
- 调用方通过总线去调用被调用方,调用方与被调用方使用同一个总线对象,调用方向总线发送某类型的事件对象,此时被调用方在总线注册自己的实例同时告诉总线自己订阅的事件类型,通过相同事件类型实现了调用方与被调用方之间的调用关系
- 调用方与被调用方之间的数据传输,将需要传输的数据作为某类型的事件对象的成员属性,在实现调用关系的同时,数据也得以传输
- 使用EventBus的示例:Guava的事件总线
Java两个模块之间调用service注入问题
遇到上述问题需要加入以下语句
@SpringBootApplication(scanBasePackages = {“com.heisenberg.weather.pro”,“com.heisenberg.authmgr”}) @MapperScan(basePackages = {“com.heisenberg.weather_pro.mapper”,“com.heisenberg.authmgr.dao”})
需要在调用别的模块的主程序上加入scanBasePackages 范围,要不然程序不知道你引用的是谁,并且要扫描创建的实体类的位置basePackages
否则出现以下情况:
No qualifying bean of type ‘com.zxq.api.dao.UserDao’ available: expected at least …
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。