总述

为什么要在靠前位置介绍代码工程结构?如果开发需要全面接触V5的代码,就需要对V5整个平台的代码管理、依赖关系、调用模式和具体一个工程的代码结构有个了解,否则不了解代码结构,根本不知道怎么入手。

1.代码结构图

首先上一张图,研发内部的代码维护模式(部分,非全部):

标准产品的代码使用Gitlab做版本管理,使用Maven做依赖管理---工程间使用Maven做了解耦控制,这是核心,也是基本要求,下面会详细说明。

对于客开,致远提供了CTP-Stuido平台进行代码管理,同样基于Maven做依赖管理,唯一不同的地方是代码版本管理(截至2021-7-11)暂时使用SVN。所以,以下代码结构相关的内容对客开有效。

如果是一个纯后端工程,或前后端不分离工程,代码结构如下:

apps-samples
   └── src
      ├── main
      |   ├── java                                                          Java代码目录
      |   |    └── com
      |   |         └── seeyon
      |   |               └── apps
      |   |                    └── samples
      |   |                          └── controller
      |   |                               └── SamplesController.java
      │   └── webapp                                                        资源目录(会输出到webapps/seeyon目录中,不会打入jar包中)
      │         ├── apps_res                                                
      │         |       └── samples                                         apps_res下存放静态资源文件,注意按照插件模块分文件夹存放
      │         |             └── css
      │         |             └── image
      │         |             └── js
      │         |             └── html
      │         └── WEB-INF
      │                ├── cfgHome
      │                |      └── plugin
      │                |            └── samples
      │                |                   └── i18n                          国际化资源存放
      │                |                   └── spring                        Spring Bean配置Dao、Manager、Controller等
      │                |                   └── pluginCfg.xml                 插件定义信息
      │                └── jsp                                               JSP页面位置,发散问题:JSP为何要存放在WEB-INF下?
      ├── test                                                               单元测试目录
      │    ├── java
      │    │    └── com
      │    │          └── seeyon
      │    │                 └── ctp
      │    │                      └── common
      │    │                            └── cache
      │    │                                  └── CacheMapTest.java        
      │    └── resources
      |          ├── data
      |          |     └── ctp-organization.xml                             单元测试所需要的组织机构
      │          └── test.properties                                        单元测试配置文件
      └── pom.xml                                                           maven配置文件

2.工程间依赖

V5产品由几十个工程组成,使用Maven做依赖管理,在Maven框架内工程间做到逻辑解耦:

  • 应用组(apps工程)之间无法直接调用,防止代码污染
  • 应用组(apps工程)之间通过apps-api桥接:接口定义在apps-api,用于应用组之间调用
  • apps-common是应用组件工程,存放水印这类应用公共组件
  • ctp-common提供平台基础组件,如国际化、上传下载组件
  • ctp-organization提供组件机构的支持
  • ctp-core提供平台核心开发框架支撑

copy by DecouplingDependencyGraph注:不同版本,工程存在一定差异

3.工程间调用示例

前面说我们工程间做到解耦,工程之间只能依靠接口的形式进行调用,而且有依赖顺序。我们所谓的接口调用一般是基于Spring IOC的形式进行注入调用。

下面以一个APP应用模块为例,介绍APP调用不同模块的接口示例。

3-1 调用平台组件接口示例

平台组件只要是ctp-core、ctp-common、apps-common这几个工程的核心库,一般应用模块可以直接引用,示例如下。

package com.seeyon.apps.demo.manager;

import java.util.Map;

import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.appLog.manager.AppLogManager;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.filemanager.manager.FileManager;
import com.seeyon.ctp.common.usermessage.UserMessageManager;
import com.seeyon.ctp.util.annotation.Inject;

/**
*注意:DemoManagerImpl一定要在Spring Bean容器中注册
*<bean id="demoManager" class="com.seeyon.apps.demo.manager.DemoManagerImpl"></bean>
**/
public class DemoManagerImpl implements DemoManager {

@Inject
private AppLogManager appLogManager;
@Inject
private FileManager fileManager;
@Inject
private UserMessageManager userMessageManager;

@Override
public void saveDemo(Map<String, Object> params) throws BusinessException {
 // 上传组件
 fileManager.update(file);
 // 审计日志组件
 appLogManager.insertLog(AppContext.getCurrentUser(), 123, "");
 // 发送消息组件
 userMessageManager.sendSystemMessage(arg0, arg1, arg2, arg3, arg4);
}

}

3-2 调用组织机构接口示例

组织机构是核心中的核心,获取人员、部门、单位、岗位、职务等信息都需要通过组织机构接口来完成,应用组调用组织机构接口的方式也很简单,一般有两种方案二选一:引入OrgManager Bean的形式,或直接调用OrgHelper的形式。

public class DemoManagerImpl implements DemoManager {

@Inject
private OrgManager orgManager;

@Override
public void saveDemo(Map<String, Object> params) throws BusinessException {
 // 方案一:注入orgManager的形式,能调用组织机构全部的接口
 V3xOrgMember member = orgManager.getMemberById(arg0);
 // 方案二:不注入Bean,直接使用OrgHelper来调用组织机构接口
 member = OrgHelper.getMember(arg0);
}

}

3-3 调用表单应用接口示例

表单也是V5里面非常核心的业务,表单无处不在,表单也分CAP3、CAP4(这块内容请自行学习),接口也做了区分。表单的接口公布在cap-api这个工程,下面是表单比较常见的调用示例。

public class DemoManagerImpl implements DemoManager {
@Inject
private FormApi4Cap3 formApi4Cap3;
@Inject
private FormApi4Cap4 formApi4Cap4;

@Override
public void saveDemo(Map<String, Object> params) throws BusinessException {
  com.seeyon.cap4.form.bean.FormBean formBean4 = formApi4Cap4.getForm(var1);
  com.seeyon.ctp.form.bean.FormBean formBean3 = formApi4Cap3.getForm(var2);
}

}

3-4 调用协同应用接口示例

协同模块归属于apps应用组,是经常被调用的模块,apps应用组之间的代码是无法被直接调用,我们通过apps-api作为桥接器实现各模块之间的物理调用。

实现原理很简单:apps-api定义Interface接口,apps-collaboration等具体应用组实现Interface,来达到解耦效果。

/**apps-api工程**/
package com.seeyon.apps.collaboration.api;

import com.seeyon.apps.collaboration.po.ColSummary;
import com.seeyon.ctp.common.exceptions.BusinessException;

public interface CollaborationApi {
/**
  * 根据id获取协同对象
     *
     * 正常:<br>
     *     1、传入正确的协同id,能获取到协同的实体<br>
     *
  * @param id 协同id
  * @return ColSummary对象
  * @throws BusinessException
  */
public ColSummary getColSummary(Long id) throws BusinessException;
}

/**apps-collaboration工程**/
package com.seeyon.apps.collaboration.api;

import org.apache.commons.logging.Log;

import com.seeyon.apps.collaboration.manager.ColManager;
import com.seeyon.apps.collaboration.po.ColSummary;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.util.annotation.Inject;

public class CollaborationApiImpl implements CollaborationApi{
   private static final Log LOG = CtpLogFactory.getLog(CollaborationApiImpl.class);
   
   @Inject
   private ColManager colManager;

@Override
public ColSummary getColSummary(Long id) throws BusinessException {
  ColSummary colSummary = colManager.getColSummaryById(id);
 if (null != colSummary) {
  try {
    ColSummary clone = (ColSummary) colSummary.clone();
    clone.setId(colSummary.getId());
    clone.setAudited(colSummary.isAudited());
   return clone;
  } catch (CloneNotSupportedException e) {
    LOG.error("", e);
  }
 }
 return null;
}

}

/**apps-demo应用组调用**/
package com.seeyon.apps.demo.manager;

import java.util.Map;

import com.seeyon.apps.collaboration.api.CollaborationApi;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.util.annotation.Inject;

public class DemoManagerImpl implements DemoManager {

@Inject
@PluginQualifier(pluginName= "collaboration") //这个注解的目的是:在没有collaboration插件的时候,防止注入报错
private CollaborationApi collaborationApi;

@Override
public void saveDemo(Map<String, Object> params) throws BusinessException {
  ColSummary summary = collaborationApi.getColSummary(arg0);
}

}

07 工程结构及依赖关系相关推荐

  1. .NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记...

    26 | 工程结构概览:定义应用分层及依赖关系 从这一节开始进入微服务实战部分 这一节主要讲解工程的结构和应用的分层 在应用的分层这里定义了四个层次: 1.领域模型层 2.基础设施层 3.应用层 4. ...

  2. jdeps_JDeps入门–分析项目的依赖关系

    jdeps JDeps是Java依赖关系分析工具 ,这是一个命令行工具,它处理Java字节码(意味着.class文件或包含它们的JAR),并分析类之间静态声明的依赖关系. 可以用各种方式过滤结果,并可 ...

  3. JDeps入门–分析项目的依赖关系

    JDeps是Java依赖关系分析工具 ,这是一个命令行工具,它处理Java字节码(意味着.class文件或包含它们的JAR),并分析类之间静态声明的依赖关系. 可以用各种方式过滤结果,并可以将其汇总到 ...

  4. 第三方依赖关系的风险:利用数十个易受攻击的 NuGet包瞄准 .NET 平台

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 研究人员分析NuGet 仓库上托管的现成可用软件包后指出,51个唯一的软件组件易受多个可活跃利用高危漏洞的影响,再次说明了第三方依赖关系对 ...

  5. cluster oracle修改,Oracle 修改集群的资源属性(依赖关系)

    修改集群的资源属性: -- 在11g中 使用Crsctl modify resource res_name -attr 命令可以随意添加修改集群的各项资源的属性 来个例子: 查看数据库资源的全部属性: ...

  6. RPM软件包管理 软件依赖关系 Yum软件的使用 上传与下载 时间设置 命令补充 zip归档工具

    环境准备 1.光盘文件放入挂载光驱设备 2.挂载光驱设备(临时挂载) mount /dev/cdrom /mnt ls /mnt ls /mnt/Packags 软件包一般都会以.rpm结尾 RPM软 ...

  7. Maven简明教程(5)---依赖关系(实例篇)

    2019独角兽企业重金招聘Python工程师标准>>> [工欲善其事,必先利其器] 上文中,我们简单介绍了依赖关系的基本理论与配置方式.但是由于这个知识点在我们日后的开发过程中会经常 ...

  8. ROS Melodic 的依赖关系记录

    我想看到各个报错和包的依赖关系,比如在 catkin_make 的时候,可能会说缺某些包,要安装依赖, 在说依赖之前,再提一点,因为我用的是树莓派3b+,内存只有1G,在编译的时候很可能会由于内存不足 ...

  9. 【面向对象编程】(3) 类之间的交互,依赖关系,关联关系

    各位同学好,今天和大家分享一下面向对象编程中,类之间的交互,类之间的依赖关系和关联关系.有不明白的可见前一章节:https://blog.csdn.net/dgvv4/article/details/ ...

最新文章

  1. 第一行代码读书笔记1+常见错误分析
  2. 虚拟打印的实现-DDK部分
  3. 一行Java代码竟能获取tomcat的绝对路径
  4. 在 Windows 中,当一个应用程序窗口被关闭,该应用程序将会保留在哪里?
  5. beetl的使用感受
  6. oracle数据库导入txt,oracle数据库导入TXT文件方法介绍
  7. 我同事今天被裁了,但我却涨了1万工资!
  8. Hadoop Trash回收站使用指南
  9. 电子书格式如何相互转换ePub、Azw3、Mobi、Doc、PDF、TXT
  10. 新世纪版五笔字根背诵
  11. 实用小技巧之电脑如何滚动截屏/截取长图
  12. linux link 硬链接,Linux系统中的硬链接(hard link)与软链接(symbolic link)
  13. CentOS6.9 网络安装及配置
  14. Mybatis-入门程序(二)
  15. composer php 扩展,正确的Composer扩展包安装方法
  16. ACM上一些常见问题解答
  17. python中一个等于号和两个等于号_Python中is与双等于号“==”的区别
  18. 港科夜闻|香港科大(广州)(筹)与民心港人子弟学校签署合作框架协议
  19. Pycharm 2017.3 最新的激活码
  20. Address of Label and Indirect Branches in LLVM IR

热门文章

  1. [TCL]Tcl语言基礎教程(三)
  2. pip、conda源更换为清华源、查看源、删除源
  3. OpenCV+VTK 读书笔记
  4. 计算机软件硬件最核心的,计算机硬件系统最核心的是什么,计算机硬件最核心部件...
  5. 微软Win11应用商店功能增强:允许用户备份/修复游戏
  6. JAVA采集图书的ISBN编号编码、出版社、出版时间、版次、正文语种、定价等信息
  7. 切换双屏之后应用不显示在桌面的问题
  8. 产品经理如何提高创造力_如何提高产品设计师的创造力
  9. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何设置页面跳转
  10. 【计算机网络】以太网供电PoE - Power over Ethernet