先做个广告,去皮儿网,可以每月26日通知你是否摇号中签。http://www.qupier.com

一直以来,组件一直都建立在技术的层面上。由于业务的复杂多变,似乎没有人想着把业务部分也做成可重用的组件。
我们团队在过去的两年里面在这个方面做了一些常识,写出来供网友参考、拍砖。

场景是企业应用,有大量类似的业务逻辑。

建立了一系列的组件,有技术封装类(例如对jsf的封装),有业务处理类的(例如权限,包含用户、角色等的维护功能,包含页面)。

这些组件的发布形式都是jar。页面在META-INF/resources里面。其中也包含了spring的bean(Annotation定义和xml定义)。

具体项目中,想要用什么功能,就依赖什么组件的jar。基础结构上提供如下几个关键点:

1.找页面的时候在webapp目录下找不到,就去jar包中找

这个可以让组件的jar种的页面生效。而且,如果组件的页面不符合项目要求,可以在webapp目录下写页面,相当于是覆盖组件的页面。

2.覆盖组件中的bean。例如有一个UserController,项目认为组件的功能不符合要求,可以以某种机制覆盖为项目的bean。

这个简单的可以使用这个规则做到:spring可以配置让xml中定义的bean替换annotation定义的bean。如果bean在组件中就是用xml方式定义的,那么可以在具体项目中指定不加载某些spring的xml配置文件实现。

3.覆盖组件中的实体模型

因为组件要完成一整块的业务,所以其中中包含了模型。例如权限组件会包含User,Role等模型。如果项目认为要扩展属性(字段),那么可以方便的扩展。我采用的具体做法是在实体类上加入一个Transient的Component,类型是一个抽象的ExtendComponent类。然后扩展了一部分hibernate的代码,在项目启动时根据配置让这个component不再Transient,并且指定具体类型。

根据以上三点,最后的效果是,如果组件功能符合,那么几乎放个jar包进去(或者做一些配置)就完全可用(例如用户管理、权限过滤等等功能)。如果不符合,那么采用以上三种机制来扩展组件。