Skip to content

一、问题与背景

背景:因某些原因回到洛阳后,本土it企业均为中小企业(小于500人),人员技术水平参差不齐,那么对于这类公司技术这块到底该怎么做?沿用大公司的架构还是顺从当前公司开发人员的理念,到底怎么做才是最好,曾经纠结过很长时间。但后来随着时间变化,领悟一个道理:需要找到一个折中的办法,不能完全照搬大公司架构,要符合企业的情况,形成特色(就像祖国一样,具有中国特色的社会主义),特色很重要!

传统的SpringMVC架构,分为Controller,Service,DAO三层。Controller控制页面逻辑,业务逻辑和事务在Service层,数据库操作通过编写sql在DAO层。

其实这样的架构非常简洁也容易上手,但是会有如下的一些问题:

  1. service层代码臃肿
  2. service层事务嵌套,导致问题狠多
  3. dao层参杂业务
  4. dao层sql语句复杂,关联查询比较多
  5. dao层经常改来改去

二、使用manager层解决

引自《阿里规约》:

Manager 层:通用业务处理层,它有如下特征:

  1. 对第三方平台封装的层,预处理返回结果及转化异常信息;
  2. 对 Service 层通用能力的下沉,如缓存方案、中间件通用处理;
  3. 与 DAO 层交互,对多个 DAO 的组合复用。

因为特色,所以在分层这块,最终还是选择阿里的架构:分为四层,如下:

  • controller
  • service
  • manager
  • dao

我们1024创新实验室把manager层追加下面的功能:

  • 复杂业务,service提供数据给Manager层,然后把事务下沉到Manager层
  • Manager层不允许相互调用(即不同业务下的manager禁止调用,如 用户 UserManager 禁止调用 订单 OrderManager ),以避免事务嵌套
  • 专注于不带业务sql语言,也可以在manager层进行通用业务的dao层封装
  • 避免复杂的join查询,数据库压力比java大很多,所以要严格控制好sql,所以可以在manager层进行拆分,比如复杂查询
  • 可以在manager层使用mybatis-plus的 BaseService,因为 manager层不会被其他业务调用,所以不会引起其他业务看到更多的BaseService方法

三、使用举例

操作多张表进行统一事务管理

  • net.lab1024.sa.admin.module.system.role.manager.RoleMenuManager
  • net.lab1024.sa.admin.module.system.employee.manager.EmployeeManager

代码如下:

java
@Service
public class RoleMenuManager extends ServiceImpl<RoleMenuDao, RoleMenuEntity> {

    @Resource
    private RoleMenuDao roleMenuDao;

    /**
     * 更新角色权限
     *
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateRoleMenu(Long roleId, List<RoleMenuEntity> roleMenuEntityList) {
        // 根据角色ID删除菜单权限
        roleMenuDao.deleteByRoleId(roleId);
        // 批量添加菜单权限
        saveBatch(roleMenuEntityList);
    }
}

outline: 'deep'

联系我们

1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。

加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
“烩面里加肉”
“ 咖啡配胡辣汤,提神又饱腹”
抖音 : 六边形工程师
直播:赚钱、代码、中医