最近在继续深入的,完整的实现前面文章《
基于事件分发机制的企业应用开发 》和《
基于拦截器的企业应用构造》中所构思的想法,在印象中,权限系统和组织结构是任何一个ERP系统都会用到的,不是随便两下就能实现的简单功能模块,实现了这两个子模块后,无论什么地方都会用得着,于是便从这两个功能入手,目前把基于RBAC的权限系统完整实现了,组织结构实现了80%,随着代码以及逻辑的增加,基于Spring IOC的配置也开始复杂起来,不过这个是无法避免的,毕竟系统目标是高度可定制,高度灵活的可配置性就意味着复杂性,这里的复杂性不是仅仅指Spring配置语法,而是指各个Bean之间的关系,每一个Service目前都必须做事务控制,安全控制,事件转换,而且问题已经不仅仅是Service的配置问题了,随着系统事件的增多,慢慢的各个事件间的逻辑关系也必须被表示出来,使得目前不得不引入了事件堆栈的概念,用来表示源于同一个操作导致的雪崩式的事件关系,目前的事件堆栈还比较简单,但是作为一个架构设计人员的敏感,我们已经嗅到了还需要把事件管理深化下去的一丝气味。这些层次,这些逻辑,已经是不能简单的靠看Spring配置才能理解的了,这个还是我们一个JVM进程能产生的需求,而多个程序,甚至多个系统集成的概念需求(例如SOA),会比这个更加复杂。在本例中,系统需要一个图形化的容易管理配置bean之间复杂关系的工具的需求越来越迫切。很自然的,我们得出一个结论:系统配置的图形化,形象化成为了业界可能的下一个发展方向。
ps:该工具最好是一个图形化的,可作进行运行时“热修改”的配置定义工具兼Service管理工具,JMX似乎是一个可以考虑的方向,不过还没想清楚如何与该配置工具紧密结合,我只是希望能够象扳动水管开关一样调整各个图形间的连接,系统里的事件流就会随之改变,事务管理,安全控制也会随之改变。不知道哪位同学知道有类似功能的东西,还劳请留个言告知一声。如果没有的话,就只能等本系统告一段落后再来解决这个问题了。如果您正在发愁不知发展方向在哪,看到了这篇文章而有所启发去做出这样一个工具的话,还希望能便宜点卖我一份 ;)。
虽然上面说了那么多,指出了IOC工具的又一个发展方向,但是我目前面临的问题还没有解决 :(
为了展示一下这个复杂度,现在把该系统其中的两个模块的Spring配置show出来:
<
beans
>
<!--
组织
-->
<
bean
id
="orgService"
parent
="baseTxProxy"
>
<
property
name
="target"
><
ref
local
="orgServiceProxy"
/></
property
>
</
bean
>
<
bean
id
="orgServiceImpl"
class
="com.wolfsquare.ibase.org.service.OrgService"
autowire
="byName"
>
<
property
name
="orgTypeService"
>
<
ref
bean
="orgTypeServiceImpl"
/>
</
property
>
</
bean
>

<!--
组织类型
-->
<
bean
id
="orgTypeService"
parent
="baseTxProxy"
>
<
property
name
="target"
><
ref
local
="orgTypeServiceImpl"
/></
property
>
</
bean
>
<
bean
id
="orgTypeServiceImpl"
class
="com.wolfsquare.ibase.org.service.OrgTypeService"
autowire
="byName"
/>
<!--
单位
-->
<
bean
id
="unitService"
parent
="baseTxProxy"
>
<
property
name
="target"
><
ref
local
="unitServiceImpl"
/></
property
>
</
bean
>
<
bean
id
="unitServiceImpl"
class
="com.wolfsquare.ibase.org.service.UnitService"
autowire
="byName"
>
<
property
name
="lifecycleListeners"
>
<
list
>
<!--
<ref bean="unitListener"/>
-->
<
ref
bean
="objectSyncOrgListener"
/>
</
list
>
</
property
>
</
bean
>
<
bean
id
="unitListener"
class
="com.wolfsquare.ibase.org.listener.UnitListener"
autowire
="byName"
>
<
property
name
="roleService"
><
ref
bean
="roleService"
/></
property
>
</
bean
>
<!--
个人
-->
<
bean
id
="personService"
parent
="baseTxProxy"
>
<
property
name
="target"
><
ref
local
="personServiceImpl"
/></
property
>
</
bean
>
<
bean
id
="personServiceImpl"
class
="com.wolfsquare.ibase.org.service.PersonService"
autowire
="byName"
>
<
property
name
="lifecycleListeners"
>
<
list
>
<
ref
bean
="objectSyncOrgListener"
/>
</
list
>
</
property
>
</
bean
>
<!--
身份-角色侦听器
-->
<
bean
id
="personRoleListener"
class
="com.wolfsquare.ibase.org.listener.RoleListener"
>
<
property
name
="roleService"
>
<
ref
bean
="roleServiceProxy"
/>
</
property
>
</
bean
>
<!--
组织机构创建删除-资源同步 监听器
-->
<
bean
id
="orgResourceSyncListener"
class
="com.wolfsquare.ibase.org.listener.OrgResourceSyncListener"
>
<
property
name
="categoryName"
><
value
>
组织机构
</
value
></
property
>
<
property
name
="resourceService"
>
<
ref
bean
="resourceServiceImpl"
/>
</
property
>
<
property
name
="includeTypes"
>
<
list
>
<
value
>
unit
</
value
>
<
value
>
person
</
value
>
<
value
>
role
</
value
>
</
list
>
</
property
>
</
bean
>

<
bean
id
="orgRoleListener"
class
="com.wolfsquare.ibase.org.listener.OrgRoleListener"
>
<
property
name
="roleService"
>
<
ref
bean
="roleService"
/>
</
property
>
<
property
name
="excludeTypes"
>
<
list
>
<
value
>
role
</
value
>
</
list
>
</
property
>
</
bean
>
<!--
组织结构对象删除侦听器 ,需要挂接到需要同步的Service上
-->
<
bean
id
="objectSyncOrgListener"
class
="com.wolfsquare.ibase.org.listener.ObjectSyncOrgListener"
>
<
property
name
="orgService"
>
<
ref
bean
="orgServiceImpl"
/>
</
property
>
</
bean
>

<
bean
id
="personToOrgRoleListener"
class
="com.wolfsquare.ibase.org.listener.PersonToOrgRoleListener"
>
<
property
name
="roleService"
>
<
ref
bean
="roleServiceProxy"
/>
</
property
>
</
bean
>
<
bean
id
="orgSecurityListener"
class
="com.wolfsquare.ibase.org.listener.SecurityListener"
>
<
property
name
="permService"
>
<
ref
bean
="permServiceImpl"
/>
</
property
>
<
property
name
="resourceService"
>
<
ref
bean
="resourceServiceImpl"
/>
</
property
>
<
property
name
="functionService"
>
<
ref
bean
="functionServiceImpl"
/>
</
property
>
</
bean
>

<
bean
id
="orgServiceProxy"
class
="org.springframework.aop.framework.ProxyFactoryBean"
>
<
property
name
="target"
>
<
ref
local
="orgServiceImpl"
/>
</
property
>
<
property
name
="interceptorNames"
>
<
list
>
<
value
>
rsi
</
value
>
</
list
>
</
property
>
<
property
name
="singleton"
>
<
value
>
true
</
value
>
</
property
>
</
bean
>
<
bean
id
="orgEventBrocaster"
class
="com.wolfsquare.ibase.org.event.OrgEventBrocaster"
singleton
="true"
>
<
property
name
="lifecycleListeners"
>
<
list
>
<
ref
bean
="orgSecurityListener"
/>
<
ref
bean
="orgResourceSyncListener"
/>
<
ref
bean
="orgRoleListener"
/>
<
ref
bean
="personToOrgRoleListener"
/>
</
list
>
</
property
>
</
bean
>
</
beans
>
角色模块的配置:
<
beans
>
<!--
角色
-->
<
bean
id
="roleService"
parent
="baseTxProxy"
>
<
property
name
="target"
><
ref
local
="roleServiceProxy"
/></
property
>
</
bean
>
<
bean
id
="roleServiceImpl"
class
="com.wolfsquare.ibase.role.service.RoleService"
autowire
="byName"
>
<
property
name
="personService"
>
<
ref
bean
="personServiceImpl"
/>
</
property
>
</
bean
>
<
bean
id
="roleServiceProxy"
class
="org.springframework.aop.framework.ProxyFactoryBean"
>
<
property
name
="target"
>
<
ref
local
="roleServiceImpl"
/>
</
property
>
<
property
name
="interceptorNames"
>
<
list
>
<
value
>
rsi
</
value
>
</
list
>
</
property
>
<
property
name
="singleton"
>
<
value
>
true
</
value
>
</
property
>
</
bean
>

<
bean
id
="rsi"
class
="com.wolfsquare.core.service.ServiceInterceptor"
>
<
property
name
="interceptorMap"
>
<
map
>
<
entry
key
="com.wolfsquare.ibase.role.service.RoleService"
>
<
list
>
<
ref
local
="eventBrocaster"
/>
</
list
>
</
entry
>
<
entry
key
="com.wolfsquare.ibase.org.service.OrgService"
>
<
list
>
<
ref
bean
="orgEventBrocaster"
/>
</
list
>
</
entry
>
</
map
>
</
property
>
</
bean
>
<
bean
id
="eventBrocaster"
class
="com.wolfsquare.core.service.EventBrocaster"
singleton
="true"
>
<
property
name
="lifecycleListeners"
>
<
list
>
<
ref
bean
="objectSyncOrgListener"
/>
<
ref
bean
="personRoleListener"
/>
</
list
>
</
property
>
</
bean
>

</
beans
>
最后,为了避免文章过于枯燥,还是show一下系统截图吧;)
一个典型的组织创建操作导致的事件的产生传递图:
组织管理的界面:
当前用户的权限,按角色分类:右边根节点表示的是登录帐户,王小二是身份,相当于权限场景(session)
整个组织的权限分布图:
应某位同学的要求,把系统实体图加上:
ps:该工具最好是一个图形化的,可作进行运行时“热修改”的配置定义工具兼Service管理工具,JMX似乎是一个可以考虑的方向,不过还没想清楚如何与该配置工具紧密结合,我只是希望能够象扳动水管开关一样调整各个图形间的连接,系统里的事件流就会随之改变,事务管理,安全控制也会随之改变。不知道哪位同学知道有类似功能的东西,还劳请留个言告知一声。如果没有的话,就只能等本系统告一段落后再来解决这个问题了。如果您正在发愁不知发展方向在哪,看到了这篇文章而有所启发去做出这样一个工具的话,还希望能便宜点卖我一份 ;)。
虽然上面说了那么多,指出了IOC工具的又一个发展方向,但是我目前面临的问题还没有解决 :(
为了展示一下这个复杂度,现在把该系统其中的两个模块的Spring配置show出来:



















































































































































































最后,为了避免文章过于枯燥,还是show一下系统截图吧;)
一个典型的组织创建操作导致的事件的产生传递图:

组织管理的界面:

当前用户的权限,按角色分类:右边根节点表示的是登录帐户,王小二是身份,相当于权限场景(session)

整个组织的权限分布图:

应某位同学的要求,把系统实体图加上:
