不完美的世界-看到了IOC工具的又一个发展方向

本文深入探讨了基于RBAC权限系统及组织结构模块的设计与实现,面对日益复杂的系统配置与事件管理,提出了图形化配置工具的需求及其可能的发展方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在继续深入的,完整的实现前面文章《 基于事件分发机制的企业应用开发 》和《 基于拦截器的企业应用构造》中所构思的想法,在印象中,权限系统和组织结构是任何一个ERP系统都会用到的,不是随便两下就能实现的简单功能模块,实现了这两个子模块后,无论什么地方都会用得着,于是便从这两个功能入手,目前把基于RBAC的权限系统完整实现了,组织结构实现了80%,随着代码以及逻辑的增加,基于Spring IOC的配置也开始复杂起来,不过这个是无法避免的,毕竟系统目标是高度可定制,高度灵活的可配置性就意味着复杂性,这里的复杂性不是仅仅指Spring配置语法,而是指各个Bean之间的关系,每一个Service目前都必须做事务控制,安全控制,事件转换,而且问题已经不仅仅是Service的配置问题了,随着系统事件的增多,慢慢的各个事件间的逻辑关系也必须被表示出来,使得目前不得不引入了事件堆栈的概念,用来表示源于同一个操作导致的雪崩式的事件关系,目前的事件堆栈还比较简单,但是作为一个架构设计人员的敏感,我们已经嗅到了还需要把事件管理深化下去的一丝气味。这些层次,这些逻辑,已经是不能简单的靠看Spring配置才能理解的了,这个还是我们一个JVM进程能产生的需求,而多个程序,甚至多个系统集成的概念需求(例如SOA),会比这个更加复杂。在本例中,系统需要一个图形化的容易管理配置bean之间复杂关系的工具的需求越来越迫切。很自然的,我们得出一个结论:系统配置的图形化,形象化成为了业界可能的下一个发展方向。

ps:该工具最好是一个图形化的,可作进行运行时“热修改”的配置定义工具兼Service管理工具,JMX似乎是一个可以考虑的方向,不过还没想清楚如何与该配置工具紧密结合,我只是希望能够象扳动水管开关一样调整各个图形间的连接,系统里的事件流就会随之改变,事务管理,安全控制也会随之改变。不知道哪位同学知道有类似功能的东西,还劳请留个言告知一声。如果没有的话,就只能等本系统告一段落后再来解决这个问题了。如果您正在发愁不知发展方向在哪,看到了这篇文章而有所启发去做出这样一个工具的话,还希望能便宜点卖我一份 ;)。


虽然上面说了那么多,指出了IOC工具的又一个发展方向,但是我目前面临的问题还没有解决 :(

为了展示一下这个复杂度,现在把该系统其中的两个模块的Spring配置show出来:
None.gif < beans >
None.gif    
<!--  组织  -->
None.gif    
< bean  id ="orgService"  parent ="baseTxProxy" >
None.gif        
< property  name ="target" >< ref  local ="orgServiceProxy" /></ property >
None.gif    
</ bean >
None.gif    
< bean  id ="orgServiceImpl"  class ="com.wolfsquare.ibase.org.service.OrgService"  autowire ="byName" >
None.gif        
< property  name ="orgTypeService" >
None.gif            
< ref  bean ="orgTypeServiceImpl" />
None.gif        
</ property >
None.gif    
</ bean >     
None.gif
None.gif    
<!--  组织类型  -->
None.gif    
< bean  id ="orgTypeService"  parent ="baseTxProxy" >
None.gif        
< property  name ="target" >< ref  local ="orgTypeServiceImpl" /></ property >
None.gif    
</ bean >
None.gif    
< bean  id ="orgTypeServiceImpl"  class ="com.wolfsquare.ibase.org.service.OrgTypeService"  autowire ="byName" />
None.gif    
None.gif    
<!--  单位  -->
None.gif    
< bean  id ="unitService"  parent ="baseTxProxy" >
None.gif        
< property  name ="target" >< ref  local ="unitServiceImpl" /></ property >
None.gif    
</ bean >
None.gif    
< bean  id ="unitServiceImpl"  class ="com.wolfsquare.ibase.org.service.UnitService"  autowire ="byName" >
None.gif        
None.gif        
< property  name ="lifecycleListeners" >
None.gif            
< list >
None.gif                
<!-- <ref bean="unitListener"/> -->
None.gif                
< ref  bean ="objectSyncOrgListener" />
None.gif            
</ list >
None.gif        
</ property >
None.gif        
None.gif    
</ bean >
None.gif    
None.gif    
< bean  id ="unitListener"  class ="com.wolfsquare.ibase.org.listener.UnitListener"   autowire ="byName" >
None.gif        
< property  name ="roleService" >< ref  bean ="roleService" /></ property >
None.gif    
</ bean >
None.gif        
None.gif    
<!--  个人  -->
None.gif    
< bean  id ="personService"  parent ="baseTxProxy" >
None.gif        
< property  name ="target" >< ref  local ="personServiceImpl" /></ property >
None.gif    
</ bean >
None.gif    
< bean  id ="personServiceImpl"  class ="com.wolfsquare.ibase.org.service.PersonService"  autowire ="byName" >
None.gif        
< property  name ="lifecycleListeners" >
None.gif            
< list >
None.gif                
< ref  bean ="objectSyncOrgListener" />
None.gif            
</ list >
None.gif        
</ property >
None.gif    
</ bean >
None.gif    
<!--  身份-角色侦听器  -->
None.gif    
< bean  id ="personRoleListener"  class ="com.wolfsquare.ibase.org.listener.RoleListener" >     
None.gif        
< property  name ="roleService" >
None.gif            
< ref  bean ="roleServiceProxy" />
None.gif        
</ property >
None.gif    
</ bean >
None.gif    
<!--  组织机构创建删除-资源同步 监听器  -->
None.gif    
< bean  id ="orgResourceSyncListener"  class ="com.wolfsquare.ibase.org.listener.OrgResourceSyncListener" >
None.gif        
< property  name ="categoryName" >< value > 组织机构 </ value ></ property >             
None.gif        
< property  name ="resourceService" >
None.gif            
< ref  bean ="resourceServiceImpl" />
None.gif        
</ property >
None.gif        
< property  name ="includeTypes" >
None.gif            
< list >
None.gif                
< value > unit </ value >
None.gif                
< value > person </ value >
None.gif                
< value > role </ value >
None.gif            
</ list >
None.gif        
</ property >
None.gif    
</ bean >
None.gif
None.gif    
< bean  id ="orgRoleListener"  class ="com.wolfsquare.ibase.org.listener.OrgRoleListener" >     
None.gif        
< property  name ="roleService" >
None.gif            
< ref  bean ="roleService" />
None.gif        
</ property >
None.gif        
< property  name ="excludeTypes" >
None.gif            
< list >
None.gif                
< value > role </ value >
None.gif            
</ list >
None.gif        
</ property >
None.gif    
</ bean >
None.gif    
<!--  组织结构对象删除侦听器 ,需要挂接到需要同步的Service上 -->
None.gif    
< bean  id ="objectSyncOrgListener"  class ="com.wolfsquare.ibase.org.listener.ObjectSyncOrgListener" >     
None.gif        
< property  name ="orgService" >
None.gif            
< ref  bean ="orgServiceImpl" />
None.gif        
</ property >
None.gif    
</ bean >
None.gif
None.gif    
< bean  id ="personToOrgRoleListener"  class ="com.wolfsquare.ibase.org.listener.PersonToOrgRoleListener" >     
None.gif        
< property  name ="roleService" >
None.gif            
< ref  bean ="roleServiceProxy" />
None.gif        
</ property >
None.gif    
</ bean >     
None.gif    
< bean  id ="orgSecurityListener"  class ="com.wolfsquare.ibase.org.listener.SecurityListener" >     
None.gif        
< property  name ="permService" >
None.gif            
< ref  bean ="permServiceImpl" />
None.gif        
</ property >
None.gif        
< property  name ="resourceService" >
None.gif            
< ref  bean ="resourceServiceImpl" />
None.gif        
</ property >     
None.gif        
< property  name ="functionService" >
None.gif            
< ref  bean ="functionServiceImpl" />
None.gif        
</ property >         
None.gif    
</ bean >     
None.gif
None.gif    
< bean  id ="orgServiceProxy"  class ="org.springframework.aop.framework.ProxyFactoryBean" >
None.gif        
< property  name ="target" >
None.gif            
< ref  local ="orgServiceImpl" />
None.gif        
</ property >
None.gif        
< property  name ="interceptorNames" >
None.gif            
< list >
None.gif                
< value > rsi </ value >
None.gif            
</ list >
None.gif        
</ property >
None.gif        
< property  name ="singleton" >
None.gif            
< value > true </ value >
None.gif        
</ property >
None.gif    
</ bean >
None.gif    
None.gif    
< bean  id ="orgEventBrocaster"  class ="com.wolfsquare.ibase.org.event.OrgEventBrocaster"  singleton ="true" >
None.gif        
< property  name ="lifecycleListeners" >
None.gif            
< list >
None.gif                
< ref  bean ="orgSecurityListener" />             
None.gif                
< ref  bean ="orgResourceSyncListener" />
None.gif                
< ref  bean ="orgRoleListener" />
None.gif                
< ref  bean ="personToOrgRoleListener" />        
None.gif            
</ list >
None.gif        
</ property >
None.gif    
</ bean >
None.gif
</ beans >
角色模块的配置:
None.gif < beans >
None.gif    
<!--  角色  -->
None.gif    
< bean  id ="roleService"  parent ="baseTxProxy" >
None.gif        
< property  name ="target" >< ref  local ="roleServiceProxy" /></ property >
None.gif    
</ bean >
None.gif    
< bean  id ="roleServiceImpl"  class ="com.wolfsquare.ibase.role.service.RoleService"  autowire ="byName" >
None.gif        
< property  name ="personService" >
None.gif            
< ref  bean ="personServiceImpl" />
None.gif        
</ property >
None.gif    
</ bean >
None.gif    
None.gif    
< bean  id ="roleServiceProxy"  class ="org.springframework.aop.framework.ProxyFactoryBean" >
None.gif        
< property  name ="target" >
None.gif            
< ref  local ="roleServiceImpl" />
None.gif        
</ property >
None.gif        
< property  name ="interceptorNames" >
None.gif            
< list >
None.gif                
< value > rsi </ value >
None.gif            
</ list >
None.gif        
</ property >
None.gif        
< property  name ="singleton" >
None.gif            
< value > true </ value >
None.gif        
</ property >
None.gif    
</ bean >
None.gif
None.gif    
< bean  id ="rsi"  class ="com.wolfsquare.core.service.ServiceInterceptor" >
None.gif        
< property  name ="interceptorMap" >
None.gif            
< map >
None.gif                
< entry  key ="com.wolfsquare.ibase.role.service.RoleService" >
None.gif                    
< list >
None.gif                        
< ref  local ="eventBrocaster" />
None.gif                    
</ list >
None.gif                
</ entry >
None.gif                
< entry  key ="com.wolfsquare.ibase.org.service.OrgService" >
None.gif                    
< list >
None.gif                        
< ref  bean ="orgEventBrocaster" />
None.gif                    
</ list >
None.gif                
</ entry >
None.gif            
</ map >
None.gif        
</ property >
None.gif    
</ bean >
None.gif    
None.gif    
< bean  id ="eventBrocaster"  class ="com.wolfsquare.core.service.EventBrocaster"  singleton ="true" >
None.gif        
< property  name ="lifecycleListeners" >
None.gif            
< list >
None.gif                
< ref  bean ="objectSyncOrgListener" />
None.gif                
< ref  bean ="personRoleListener" />
None.gif            
</ list >
None.gif        
</ property >
None.gif    
</ bean >
None.gif
None.gif
</ beans >

最后,为了避免文章过于枯燥,还是show一下系统截图吧;)

一个典型的组织创建操作导致的事件的产生传递图:

web1.gif
组织管理的界面:
web.gif
当前用户的权限,按角色分类:右边根节点表示的是登录帐户,王小二是身份,相当于权限场景(session)
web2.gif
整个组织的权限分布图:
web3.gif
应某位同学的要求,把系统实体图加上:
entity.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值