一、问题由来

  目前刚入职一家新公司不久,公司的新项目采用DDD驱动领域设计来进行开发,架构这一块使用的是阿里巴巴开源的最新框架COLA4.0的架构。

主要是这个框架里面的分层设计。主要分为四层:adapter适配层类似于以前的Controller层;app层类似于以前的Service层;domain层是领域层;还有

一个infrastructure层表示基础设施服务层,提供基础服务,比如数据库服务。项目还是进行设计阶段,自己主要负责开发这一块。由于大家都是刚开始

接触DDD这个新知识,因此还有很多东西都需要学习。由于我们负责的这个项目属于通用域,而且人手也不是太多,因此很多东西都需要亲力亲为。

比如说搭建项目框架,基础架构采用cola4.0,里面具体使用什么版本的SpringBoot,SpringCloud,Redis,Postgresql等等,都得我们自己来定。自己

也没闲着,立马去学习Cola4.0这个框架,由于这种设计理念很是新颖,因此在网上可供参考学习的资料很少。不像什么SpringBoot,springCloud之类的

课程,一搜就一堆的答案。Cola4.0的框架的大致架构如图所示:

详细的错误信息如下:

a component required a bean of type xxxxxx that could not be found
Action
Consider defining a bean of type xxxxxx in your configuration

二、问题分析

  从错误信息来看,大致意思就是组件找不到类型为xxxxxx的bean,可以考虑在配置中定义一个bean。自己根据实际情况来判断报错的类型是一个接口,

这个接口有具体的实现类,实现类中使用的注解为@Component.这个接口有在其他地方被使用,启动项目时由于这个类没有被加载到,因此报这个错。能

确定一点就是接口的实现类没有被加载到,可是为什么没有被加载到呢?框架是我们按照cola4.0的架构自己来搭建的,它里面就是一些简单的骨架,没有

具体封装一些代码之类的,我们用的话也只会考虑使用它的架构。这就很让人疑惑,使用原作者的框架就可以正常运行,怎么自己来搭建就不行了呢?

三、解决方案

拿到这个错误信息,自己立马开始使用搜索引擎。由于这个项目比较特殊,启动类是单独为一个start项目,主要作用就是用来启动

项目,不做其他任何事情。

尝试方案一:

推测接口实现类中没有添加对应的注解,所以不能被扫描到。

自己经过检查,发现所有的接口实现类都添加了@Component注解。会不会有这种可能,这个注解不生效?

于是自己换成@Service注解,重新启动项目,发现问题任然未解决。

参考文章 https://blog.csdn.net/qq_39691492/article/details/118085232

尝试方案二:

推测导致这个错误的原因可能是由于接口的实现类没有被扫描到,没有正确加载到spring容器中,最终出现问题。

使用@ComponentScan包扫描注解,把接口实现类的包路径放进去,然后重新启动项目。结果为解决。

参考文章 https://blog.csdn.net/suxiexingchen/article/details/84984349

尝试方案三:

推测可能是包结构不对导致来加载错误。这到是有可能,然后自己仔细检查了项目的包结构,排除此问题,包结构

没有问题,还是没有解决。

https://blog.csdn.net/Julycaka/article/details/80622754

这时候自己就开始分析,说先确定一点接口的实现类没有被加载到spring容器中,为什么会没有被加载到呢?然后自己

倒回去看看cola4.0的例子,查看模块之间的相互引用关系,这时发现问题了。demo例子中app层直接引用了infrastructure,

我们自己搭建的框架中没有做这个引用,这就导致infrastructure层中的代码没有被正确扫描到,继而不能被加载到spring容器中。

自己立马去app层中添加该模块,然后重新启动项目,发现启动成功,问题解决。

总结:使用maven进行多模块开发的时候,需要确保所有的模块中的包路径都能被扫描到,否则就会导致类加载不了的问题。

不管是直接引用还是间接引用,只有所有的模块都和启动类关联起来后,项目才能够正常启动。我们的项目中引用关系如下:

start层 引用 adapter层;

adapter层 引用 app层;

app层 引用 domain层;app层 引用 infrastructure层;

infrastructure层 引用 domain层;

common层被除start层外的所有模块引用;

这样虽然项目启动层start中只有一个启动类,通过这种直接的或者是间接的引用关系就可以加载所有的bean对象。

最新文章

  1. 代码管理工具 --- git的学习笔记一《git的个人开发》
  2. Linux Basis --- commands of vi
  3. poj 1004:Financial Management(水题,求平均数)
  4. LeetCode Palindrome Permutation
  5. java中的vo 、dto 、dao--转
  6. Storm系列之一——Storm Topology并发
  7. Struts2的标签库(一)——使用Struts2的标签库
  8. SQL Server高可用——日志传送(4-3)——使用
  9. Python2.7学习笔记-定义函数、filter/map/reduce/lambda
  10. BiLstm与CRF实现命名实体标注
  11. Zookeeper核心工作机制(zookeeper特性、zookeeper数据结构、节点类型)
  12. ubuntu 下dns一类的处理
  13. block引用外部变量原理
  14. Eureka自我保护模式——难点重点
  15. 谈谈入门iOS的经验吧
  16. noip2007部分题
  17. 20165227 实验三《敏捷开发与XP实践》实验报告
  18. Spring 事务管理案例
  19. [NOI2007]货币兑换 --- DP + 斜率优化(CDQ分治)
  20. Mac与iPhone的使用

热门文章

  1. 用一个文件,实现迷你 Web 框架
  2. C++“拷贝构造函数”和“等号重载”有什么区别?
  3. pandas学习总结
  4. 阿里云场景化阿里云企业数字化转型售前方法PSA
  5. 在原生CSS中使用变量
  6. BFC理解
  7. 浅析Node与Element
  8. 将百度地图Demo抽取出来安到自己的程序中
  9. Mybatis的简介+简单实现增删改查案例
  10. js new Date()参数格式