SSM 框架 各层 用到的类要怎么管理?

新手上路,刚学完 ssm 还没学 spring Boot,请教各位前辈:
网上各家教程都讲了 mvc ,controller 层,service层,dao 层以及分别是干什么的,但java 不像前端 js ,是强类型语言,每一个实例对象都要有对应的类,那么仅仅是这三层包应该是不够吧?比如我写的这个登录controller 就已经衍生出三四个类了:
image.png

如图分别是controller,请求入参对象的类,响应返回对象的类,还有响应数据按统一格式封装的类,虽然响应数据按统一格式封装的类将来其他接口也会复用,但是像请求入参,响应出参,几乎每个接口都是各自唯一的,甚至有时候响应出参 json格式 还涉及到嵌套,以及将来业务逻辑复杂了service层应该也会多出很多类,那么这些类我该怎么去维护管理呢?总不能每一个请求都对应着创建一个包吧?

因为还没有学 springBoot,所以找了几套实际生产的代码看着都有些吃力,最终没搞明白,希望各位前辈不吝赐教,如果有好心人能给画个最简单的项目结构的示意图就更好了,感谢各位大佬。。。

阅读 2k
3 个回答

回答:在SpringBoot中确实有着相对规范的一种包命名方式,主要包括:config、controller、entity、dto、bo、vo、mapper、service、util、interceptor、filter、task等;一般持久层框架现在主流的都选择mybatis-plus,它的mapper就放在mapper包中,然后service及其实现类就放在service和它的子包impl中,controller一般就放controller类,用于写一些接口;entity里面可以存放数据库映射实体,vo、bo可以存放一些参数传递实体;你可以参考这个项目进行基本的了解:https://gitee.com/anxwefndu/library-management-system
image.png

https://segmentfault.com/a/1190000022110134

《阿里巴巴Java开发手册》的定义是:
DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。

项目一般用到
入参对象:新增、修改、查询;
数据库对象;
出参对象:详情、分页;

XxxControllerXxxService还有XxxDao或者XxxMapper这种类属于服务类,他们是提供功能的,一般是单例存在,只有一个实例,你写的什么LoginResultLoginResponse还有ResponseResult这些事model,是数据模型,用来承载数据的,为XxxControllerXxxService还有XxxDao等提供服务支撑的,不要只看类的数目,看他的作用。

另外,每个请求有出入参,就要有对应的类,这样代码量很大,类的数目也非常多,这是每个Java学习者都面临的问题,Java这个语言就是这样的,类很多,这是正常的,你可以通过继承、复用类、设计模式等方式简化你的代码,减少类的数量,比如:

ResponseResult是一个公共响应容器类型,每个接口的出参都要用到,里面除了data属性外,其他都是一样的结构,那你可以将data的类型抽象为泛型R,简化类为

class ResponseResult<R>{
    private String msg;
    
    private int code;

    private R data;

}

另外,每个接口都要用ResponseResult包装一层,你可以通过ControllerAdvice或者RestControllerAdvice做统一包装,异常方面,可以使用ExceptionHandler做全局拦截,你的异常信息,直接throwController层即可。