以下列举介绍框架中涉及到的主要技术选型设计原则,各技术组件具体版本信息请参考技术组件列表
核心模块级功能设计文档快速链接:
MVC Framework: 在Spring横行的时代,那就选择Spring MVC一统天下吧。
UI Framework: 主体基于主流的JQuery、Bootstra等,并引用Metronic UI套件来大幅简化UI界面和组件的设计开发工作量,注意此组件为收费组件,但是相对一个项目或产品的成本其费用很低,详见官方License许可说明。
Chart/Plot: 对于一些客户需要很炫的在线图表功能,虽然Flash不失为一个选择,但是更倾向于类似ECharts这样的国内主流图表插件。
Grid/Table: 对于企业应用具有一个功能强大的表格Grid组件,无论对于开发和用户体验来说,都能起到事半功倍的效果。经过多个项目经验积累,框架选择了目前主流的free-jqGrid插件。该Grid组件功能非常丰富强大,除了一些分页、多字段排序等基础功能外,还包括诸如TreeGrid、SubGrid、AdvancedSearch、Group、ColumnChooser等众多高级特性。
CSS Framework: 最热火的Twitter Bootstrap,提供了简便的布局能力和基本的页面美化。
Embedded Resource: 为了组件封装的目的把JS、CSS和JSP等文件以Jar方式加载,按照Servlet3.0 JSR315规范,直接把相关JS、CSS和JSP等文件放到Jar文件的META-INF/resources目录下即可, 详见开发框架 entdiy-module-common 的src/main/resources/META-INF/resources目录即一目了然,终于可以优雅的jar文件方式提供组件分发了。 当然如果你的项目应用服务器版本较低不支持这个特性也不用急,只需简单把resources目录下相关文件直接拷贝到常规的webapp目录下就行了。
JavaScript/CSS Compressor: 选择YUI Compressor。 并结合yuicompressor-maven-plugin实现构建过程对JS、CSS文件进行minify compressor处理。 这样有个好处是整个开发过程本地加载都是未经压缩处理的原始文件内容方便进行Debug问题对比分析,之后由Continuous Integration持续集成服务自动化处理相关资源优化,实现开发效率和运行效率的兼顾。
Restful API: 直接利用Spring MVC对于RESTful的原生支持特性,基于NegotiationContentTypeHandlerManager实现动态选择对应的响应输出格式。 结合Swagger Restful API文档工具提供友好的API接口展示,便于APP对接开发。
Spring Framework:对于这位JEE业界的主角就不用多说了。本框架采用最新的Spring5.X版本。
Security Framework: 随主流选择Apache Shiro。验证码那自然是主流的JCaptcha,并进行一定程度的样式扩展定义。
Report Support(TODO): 把Excel导出操作也看成是报表输出的一种常见形式,对此Apache POI是少不了的,在此基础上还选择了JXLS可以比较方便的以模板的形式进行Excel数据的导出导入操作,比起直接的POI API操作更简洁。 对于更专业复杂的报表需求,那自然需要专业的报表引擎和工具来支持,框架选择自己熟悉的JasperReport及其最新可视化建模工具Jaspersoft Studio,结合Struts集成、中文字体扩展、设计工具等整合,基本可以解决大部分企业报表需求。 同时可以再整合JasperReports Server实现一整套报表设计和部署运行服务。
Workflow Support(TODO): 整合集成最新的Activiti工作流引擎,开发阶段采用Eclipse插件进行流程设计, 框架提供一些基础管理功能,更强大完整的管理功能可借助部署activiti-explore实现在线的流程设计和管理;为了降低工作流与业务系统的耦合度,可以再借助activiti-rest以REST方式实现工作流引擎与业务流程的交互。
ORM Framework: 从封装程度来说,Hibernate > MyBatis > SpringJDBC,SpringJDBC应该只能算作是对JDBC的增强封装还算不上ORM,至于Hibernate和MyBatis(以前的iBatis),关于上述几者的对比讨论网上一搜一大把。 自己也是两种类型的项目都多次经历,经过权衡考虑,最终选择了JPA+Hibernate组合,几点理由:
Query/Pagination/Sort: 框架基本打通前端UI到后端数据访问的动态参数/分页/排序整个环节,基本只需要少量的按照参数名称规则,对于Grid表格数据查询基本不用任何编码,即可实现非常灵活而强大的动态数据访问支持。基本流程是把Web前端传入的按照约定的参数集合转换为结构化查询对象,然后传入业务层组装为基于JPA Criteria语法的Spring JPA Data识别的动态查询对象,最终由Hibernate转换为底层数据库查询SQL语句。
Group/Aggregate: 除了基本的增删改查数据访问,对于企业应用系统还有一种很常见的分组聚合统计,例如需要把明细库存信息按照库存地/商品等不同维度进行分组汇总统计显示。为了简化此类需求的开发,框架做了一个基于JPA Criteria的进一步封装,前端层面只需简单传入需要分组和聚合规则的属性列表,即可返回与之对应便于用于JSON序列化的Map结构数据,最方便的是即便是聚合属性也能像常规的对象属性查询一样支持动态参数/分页/排序等特性。
Cache: 框架中在Spring和Hibernate层面都引入了Cache处理以最大化提升数据访问性能,采用主流的Redis,生产环境集群部署采用distribution配置模式。
Data Historical Audit:对于企业应用比较常见一个需求就是对于关键数据的变更过程进行历史版本记录以便支持对业务操作的追踪审计,通俗说就是:什么人在什么时间操作了什么数据,一方面可以防止用户对于业务操作的抵赖情况,一方面可以在遇到数据问题时有据可查。 Hibernate Envers对此提供了支持,基本思想就是每次数据保存操作时依靠Hibernate Event Listener方式自动把涉及的业务数据复制一份到对应的审计表中。 框架对此进行扩展设计,提供通用的审计数据列表和版本对比查看功能界面。
对于测试,无论如何强调其重要性都不为过,但是在具有中国特色的项目开发实施过程中要充分保证测试的完整和质量不是件容易的事,好像这已经超出开发框架探讨的范畴了。 不过实施的力度如何,还是建议项目团队至少做好以下三个方面:基础的Unit单元测试,每日构建的自动化测试,无法替代的人工功能测试。
Unit Testing: 典型的JUnit4+Spring-Test组合。基本的CRUD就不用逐一编写单元测试代码了,DAO层来说相对优先级低因为一般的DAO层问题都会传导到Service层, Web层测试就更加繁琐了有条件也可以考虑基于主流的Mock组件编写单元测试代码。因此Service应该是重点,一般建议对关键的、复杂的业务逻辑方法编写足够的单元测试代码以保证健壮性。 而且需要强调:所有单元测试代码都需要在自动化构建环境按计划运行,因此必须每个保证单元测试的独立可重复运行原则,不能简单在本地开发环境运行通过就认为没有问题。 具体可参考框架测试代码样例,同时框架简单的封装了一个以反射和随机方式构建测试Entity对象实现的帮助类。
Smoke Testing: 借助持续集成的自动化构建和测试过程,实现基本的应用部署冒烟测试,具体可参考showcase的pom.xml中的smoke profile定义和示意性的冒烟单元测试代码IndexSmokeMock.java。 通过此步骤可以确保持续构建生成的war包应用是基本可运行的应用,避免由于编译构建成功但是实际运行失败的应用部署到人工测试环境,从而减少不必要的人工测试中断影响。
Automation Testing: 如果项目组中条件允许,可以类似IndexSmokeMock单元测试编码方式,通过Selenium的FireFox插件录制一系列各业务功能的自动化测试脚本,然后配置到持续集成环境的自动化测试运行。 理论上自动化程度越高,所需投入的成本越大,但是同时会带来对人工测试的成本降低作用,但一般来说自动化测试和人工测试基本无法相互代替,需要在项目过程中摸索评估出一个相对平衡的方案。
开发规范及模式:尽可能引用及遵循主流的Java开发规范及模式,如尽可能采用Java8+最新的Date/Time API、Optional、Stream、Lambda等特性编码; 引入阿里巴巴Java Coding Guidelines及IDE插件对Java编码进行规范;JavaScript插件扩展编码尽可能统一基于Bootstrap Plugin设计和编码模式; 以便整体提升框架设计和编码质量及二次开发可读性可维护性。
JSON (De)Serialization:主要用在Web序列化输出JSON响应,Jackson功能强大,基于注解方式非常便捷。
Logging: 最Fashion的Slf4j+Logback组合,再加上log4j-over-slf4j和jcl-over-slf4j兼容其他需要Log4J和Common Logging的第三方组件。
SQL Tracking: 直接采用阿里的Druid数据源组件,即提供直接在Console查看实际执行的SQL语句,而且提供功能强大的StatViewServlet监控功能界面。
Others:Apache Commons系列; [Guava]是(http://code.google.com/p/guava-libraries/) Google的帮助工具类等方便实用的组件运用在框架代码中随处可见
Java EE IDE:既然走的Spring路线,如果完全开源免费的角度首选Spring Tool Suite; 如果能接受商业收费软件那首推IntelliJ IDEA
Source Version Control: 主流的源代码版本控制机制,SVN/GIT等大可根据自身项目情况选择即可
Apache Maven 3: 整个项目采用Maven进行工程依赖管理,目前熟悉在用Apache Maven3.0.X系列
Sonatype Nexus: 按照Maven风格管理配置的大型团队项目,如果让所有开发人员都在线去下载更新相关资源库组件就太低效了,因此在项目内部搭建Maven私服就显的很有必要了。 Sonatype Nexus提供的开源免费版本基本够用,当然如果要求更高可以选择付费专业版本。
Continuous Integration:对于大型团队开发项目,搭建自动化构建的持续集成环境那就更是非常有必要了。既能提早及时有效的发现开发过程中的Bug反馈,又能极大的规范和简化应用部署发布流程。 Jenkins(以前的Hudson),搭配丰富的插件,功能强大,方便好用。
Sonar (Code Quality Review): 对于一个人员众多大型的应用系统开发,一套有效的自动化代码质量检测评审工具既可以提升和规范整个团队的代码质量,也可以大幅减轻人工评审的工作量。SonarQube™ software (previously known as “Sonar”) is an open platform to manage code quality. 。当然,除了工具层面的自动化评审,定期的人工评审机制对于项目质量的保证还是很有必要的。
Unix/Linux Shell Scripts: 绝大部分情况J2EE应用都会部署在Unix/Linux操作系统环境,通过编写一些常用的Shell脚本可以有效的提高应用更新的效率和简化人工操作流程,尤其是在开发环境可以实现全自动更新部署。
以下首先列举本框架在自己开发过程中的相关环境以及实际在生产环境配置运行过的环境说明,鉴于Java多元化运行环境支持和Hibernate通用数据库支持,应该是能支持绝大部分主流J2EE运行环境的,具体可自行测试部署。
JDK:JDK8+,java 8 date/time, lambda等新特性应用。
System:主流支持Java运行的操作系统皆可部署运行,目前已在CentOS Server/Ubuntu Server等主流Linux操作系统生产环境运行
Docker:演示一键部署运行及其他持续集成、生产部署等,均采用主流的Docker模式部署运维管理
Java EE Server:支持Java8的Java EE Server,如Tomcat 8+
Database: 单元测试默认使用H2 Database嵌入数据库实现快速高效的内存模式运行,其余开发和演示等环境均采用主流的MySQL,其他曾在项目中应用过的包括Oracle 10g,SQL Server 2008
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。