`
wolfsquare
  • 浏览: 84022 次
  • 性别: 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)

整个组织的权限分布图:

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

相关推荐

    Spring5 框架 ---- IOC容器 ---- 代码

    Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...

    Spring----IOC实现

    Spring框架是Java开发中不可或缺的一部分,它以IoC(Inversion of Control,控制反转)为核心,极大地简化了软件组件的管理。在这个名为“Spring---IOC实现”的项目中,我们将深入探讨Spring如何通过IoC实现对应用...

    maven-spring-ioc

    Spring框架是Java开发中的一个核心组件,它提供了许多功能,其中最重要的一项就是Inversion of Control(IoC),也称为Dependency Injection(DI)。IoC容器是Spring的核心,它负责管理对象的生命周期和对象间的依赖...

    Spring--IOC

    虽然AOP不在本次讨论的"Spring--IOC"主题内,但它是Spring框架的另一个重要特性,它允许我们在不修改已有代码的情况下,添加横切关注点,如日志、事务管理等。 **MyEclipse5.5开发平台** MyEclipse5.5是一款基于...

    springmvc-springioc-lib.rar

    springmvc-springioc-lib.rar springmvc-springioc-lib.rar

    SOA实践 -- 使用IoC和AOP重构SOA应用

    虽然描述部分为空,但我们可以根据标题推测,这篇文章可能讲述了一个实际的案例或项目,其中作者使用IoC和AOP技术对现有的SOA应用进行了改造,提高了代码的解耦度和模块化,使得系统更易于扩展和维护。博文链接可能...

    Java-Spring-SpringIoC容器-SpringIoC的学习

    在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...

    sdl-ioc-editor.zip

    安全开发生命周期)和ATT&CK(Adversarial Tactics, Techniques & Common Knowledge,敌对战术、技术和常见知识)相关的项目,而"IOC Editor"则是一个用于编辑威胁情报指标(Indicator of Compromise,IOC)的工具。...

    Spring-ioc-jar

    Spring IOC,全称为Inversion of Control,中文常被称为“控制反转”,是Spring框架的核心特性之一。这个概念在软件设计中引入了一种新的依赖管理方式,它将对象的创建和管理权交给了容器,使得开发者可以更专注于...

    一个小小的Ioc工具

    1:创建一个空的Java工程 2:将lib目录下的包与demo下src目录放入工程 3:将编译demo代码 4:运行文件: demo\src\org\jmin\test\...5:运行文件:demo\src\org\jmin\test\swing\SwingAppStarter.java 一个ioc应用XML案例

    Spring - 2 IoC

    - **特性**:IoC容器的一个显著特点是实现了控制反转,开发人员不需要直接操作容器API,也不需要关心容器的具体实现细节。 ##### 2. IoC容器与JavaBean的关系 - **IoC容器**可以被视为一个通用的Bean工厂,它能够...

    spring技术--IOC控制反转课件.ppt

    **Spring技术--IOC控制反转** 在Java开发领域,Spring框架以其...总之,Spring的IOC技术通过控制反转和依赖注入,提高了代码的可维护性和可扩展性,降低了系统复杂性,是现代Java企业级应用开发中不可或缺的一部分。

    Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程.doc

    Spring 框架采用的 IOC 模式是通过一个容器来管理对象之间的依赖关系。 本文的目标是分析 Spring 框架如何实现将资源配置(以 xml 配置为例)通过加载、解析、生成 BeanDefination 并注册到 IOC 容器中的。 IOC ...

    01-Spring源码手写篇-手写IOC.md

    01-Spring源码手写篇-手写IOC.md

    Java开发学习(二)----IOC、DI入门案例.doc

    DI是IOC的一种实现方式,它允许开发者声明类的依赖关系,而不需要在代码中直接创建依赖对象。依赖注入可以通过构造函数、setter方法或者接口来实现。在Spring框架中,通过XML配置文件或注解来定义对象及其依赖关系。...

    BlueSky-IOC

    "工具"标签则意味着BlueSky-IOC是一个实用的开发辅助工具,可以帮助开发者更高效地管理项目中的对象生命周期和依赖关系。在实际开发中,它可以减少代码的重复编写,提高开发效率,并促进团队协作。 压缩包内的文件...

    Spring-IOC实现

    - 虽然不是IOC直接的一部分,但AOP是Spring框架的另一个重要特性,常与IOC一起使用。它允许我们定义横切关注点,如日志、事务管理等,以解耦业务逻辑。 10. **测试支持** - Spring提供了测试支持,如@Test注解的...

    Spring-IOC笔记

    spring-IOC的一些笔记心得

    Spring框架-IoC实现CRUD

    Spring框架-IoC实现CRUD

    Spring--IOC学习资料(pdf)

    3. **Map注入**:虽然不常见,但在某些情况下,可能需要将与特定类相关的多个对象注入到一个Map中。 ### Bean管理 在Spring中,Bean是构成应用程序的基本单位,通常对应于Java对象。Spring容器负责Bean的实例化、...

Global site tag (gtag.js) - Google Analytics