【IT168 技术文章】
该样本程序在充分利用已有开源框架的基础上,开发了独立的SinoSoftFrame架构,基于J2EE规范实现,主要分为三层: Web层、业务层、持久层,很好地适应了财产保险行业的业务特点。
财产保险行业业务具有以下特点:
1.保险险类、险种、产品众多
财产保险公司往往有包括企财险类、家财险类、责任险类、工程险类、车险类、船舶险类和货运险等几十个险类,上百个甚至几百个业务险种。这些险类险种既有共性,又有特性,如何将这些共性和特性有机地组织在一起是我们必须要有效解决的问题。
2.全流程业务需要
财产保险业务往往包含了投保、承保、批改、理赔、收付、财务等多个业务处理环节,同时还要通过挂接核保核赔管理和单证管理功能来降低企业的经营风险。提供多种统计分析与查询接口实现业务数据的统计分析,为企业经营决策提供及时、有效的支持和帮助。为统一架构与开发规范,降低保险公司的开发和维护成本,设计的技术架构必须能满足众多子系统的业务需求与技术要求。
3.新产品上线要求时间短
保险公司为了抢占市场,争夺客户,从研发推出新产品到产品上线往往只有一周甚至更短的时间,这对我们的系统架构提出了极高的要求。
4.行业高速发展,业务多变
保险行业是个高速发展的行业,业务多变,这是当前保险行业的特性决定的,我们只能去适应这些变化。所以,要求我们的架构必须具备很强的应变能力。
5.多语言支持
随着保险业的逐渐对外放开,越来越多的外资保险公司成为我们的客户。多语言支持成为这些客户对我们系统的基本要求之一。
当然财产保险行业还有其他一些特点,如全国大集中数据管理方式、总公司-分公司分支机构的管理模式、无纸化单证管理等等。作为财产保险公司的行业解决方案,系统必须能够适应以上这些行业特点,满足财产保险公司向用户提供新业务、新服务,适应市场竞争的需要; 满足各地区业务的变化性,适应地方性险种管理的需要。
从保险的定义出发,保险业务领域可分为投承保、批改、理赔等多个业务环节,针对样本程序,本文仅介绍承保业务。承保是保险业务的开始,承保信息关系到保单能否生成、与投保人能否签订合同、能否出具保单等。本样板程序以保险领域中“投保处理”环节作为参照实现,所以我们此处仅针对投保单相关的数据模型进行重点说明。
数据模型
“投保处理”环节涉及到了用户投保录入时的众多信息元素,包含了基本信息、标的信息、险种费用信息、条款信息、共保信息等五大类。投保录入主要涉及到四个主要的实体对象: 投保单主表、投保单险种表、标的主表、标的物险别责任表。除了这四个主要实体对象之间存在着一对多的对象关系外,每个实体对象还关联着众多的从属对象。
投保单主表是整张投保单的概括信息,它的相关从属表有投保兑换率表、投保单条款表、保险关系人表、收费计划表等; 投保单险种相关表描述的投保单项下各险种的相关信息,当投保单中存在多险种时,险种表描述多条险种信息,它的相关从属表有投保单保额保费表、险种条款表、险种费用表等; 投保单中的标的信息放在标的相关表中进行分类描述,以区分不同险种下的不同标的,它的相关从属表根据险类的不同有财产险标的信息、车险标的信息、动态标的信息等等; 标的险别责任相关表是对投保单中标的最明细的描述。它的相关从属表有标的物责任条款表、险别责任附加费表、险别责任免赔额表、险别责任赔偿限额表等。
总体架构
本着“不重复造车轮但也绝不依赖于任何第三方框架”的设计思想,我们独立设计开发了自己的基础框架体系SinoSoftFrame,在此SinoSoftFrame框架体系上,在部分层面引入一些优秀的开源产品,集成到我们的框架体系SinoSoftFrame中。这样,当已集成的产品在技术和效率上无法满足我们的业务需要时或在某个层面有更好、更快、更有效的新产品时,我们可以很容易地从SinoSoftFrame中完成新产品的升级替换,而对已开发完成的业务实现代码不产生任何影响或将影响降到最低。SinoSoftFrame架构基于J2EE规范实现,主要分为三层: Web层、业务层、持久层。
Web层采用MVC模式,主要任务是接收用户从页面提交的请求和最终返回处理结果。对于处理用户请求来讲,Web层的任务是读取用户提交的表单数据,把HttpServletRequest中的表单数据和请求参数封装到数据传输对象DTO中供业务层处理; 对于返回处理结果来讲,Web层的任务是把业务层处理完毕后返回的数据传输对象DTO返回给JSP页面展现给客户。
业务层主要完成业务逻辑的实现。如业务数据校验、业务逻辑处理、事务管理、记录业务处理日志、抛出业务处理异常等任务。
持久层仅用来完成业务数据持久化和查询读取,这里采用关系型数据库来完成数据的持久化保存,因此持久层主要完成数据库的CRUD(增、删、改、查),同时包含对存储异常的处理等任务。
SinoSoftFrame通过模拟Spring的实现机制建立了自己的容器实现机制,并通过定义接口、扩展基类等方法将对第三方依赖的内容封装到SinoSoftFrame中,从而实现与第三方框架的解耦。下面重点说明一下在架构设计的三层上具体采用的实现方式或开源框架。
因Web层确定采用MVC的设计模式,而软件开发领域有很多优秀的MVC开源框架,如Struts、WebWork2、Spring MVC等等,但也各有其优缺点。SinoSoftFrame的Web层实现选择了Struts,原因主要是基于它历经6年的不断成熟、它的稳定开发团队、它庞大的社区、用户和程序员基础。页面展现仍采用了传统的JSP+Taglib的实现方式。毕竟开发成本也是架构设计和选型要考虑的重要因素之一。
业务层框架的设计要求是增加模块或代码的复用性,降低业务类之间的耦合,减少程序修改带来的“涟漪”效应。在SinoSoftFrame的业务层我们选择了Spring。Spring是一种无侵入式的轻量级框架,可以用简单的POJO去完成接口类的定义及实现的调用,绝大多数业务对象都不需要依赖于Spring;可以很容易对业务层进行单元测试; 它促进程序员养成好的编程习惯(把对接口编程而不是对类编程的代价几乎减少到零)。当然,Spring框架带给我们的优势不只以上这些,它就像系统的粘合剂,对系统各个层面各个环节的功能、实现框架都提供了无缝的支持。不过,最主要也是最重要的还是Spring的Ioc模式实现(Ioc通俗来说,就是在编制程序时,只要写被调用者的接口代码,具体子类实例可通过配置实现)。
SinoSoftFrame选择了Hibernate作为持久层实现。Hibernate是一种Java语言下的对象关系映射解决方案。
它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短了手工处理SQL和JDBC的时间,而且它不会强迫修改对象的行为方式,不需要实现任何框架要求的接口。惟一需要做的就是创建一份XML“映射文档”,告诉框架你希望能够保存在数据库中的类,以及它们如何关联到该数据库中的表和列,然后就可以要求它以对象的形式获取数据,或者把对象保存为数据。同时,它可以支持多达十六种数据库,包含企业级常用的Oracle、DB2、Informix、SQLServer、Sybase等。SinoSoftFrame系统架构如图1所示。
同时,为了提供非常好的的用户体验,SinoSoftFrame框架中还引入了Ajax的DWR实现,加上Ajax的调用层次后,系统调用架构如图2所示。
