`
wolfsquare
  • 浏览: 83587 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

阅读更多
最近在继续深入的,完整的实现前面文章《基于事件分发机制的企业应用开发 》和《基于拦截器的企业应用构造》中所构思的想法,在印象中,权限系统和组织结构是任何一个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)

整个组织的权限分布图:

应某位同学的要求,把系统实体图加上:
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics