不完美的世界-看到了IOC工具的又一个发展方向
最近在继续深入的,完整的实现前面文章《基于事件分发机制的企业应用开发 》和《基于拦截器的企业应用构造》中所构思的想法,在印象中,权限系统和组织结构是任何一个ERP系统都会用到的,不是随便两下就能实现的简单功能模块,实现了这两个子模块后,无论什么地方都会用得着,于是便从这两个功能入手,目前把基于RBAC的权限系统完整实现了,组织结构实现了80%,随着代码以及逻辑的增加,基于Spring IOC的配置也开始复杂起来,不过这个是无法避免的,毕竟系统目标是高度可定制,高度灵活的可配置性就意味着复杂性,这里的复杂性不是仅仅指Spring配置语法,而是指各个Bean之间的关系,每一个Service目前都必须做事务控制,安全控制,事件转换,而且问题已经不仅仅是Service的配置问题了,随着系统事件的增多,慢慢的各个事件间的逻辑关系也必须被表示出来,使得目前不得不引入了事件堆栈的概念,用来表示源于同一个操作导致的雪崩式的事件关系,目前的事件堆栈还比较简单,但是作为一个架构设计人员的敏感,我们已经嗅到了还需要把事件管理深化下去的一丝气味。这些层次,这些逻辑,已经是不能简单的靠看Spring配置才能理解的了,这个还是我们一个JVM进程能产生的需求,而多个程序,甚至多个系统集成的概念需求(例如SOA),会比这个更加复杂。在本例中,系统需要一个图形化的容易管理配置bean之间复杂关系的工具的需求越来越迫切。很自然的,我们得出一个结论:系统配置的图形化,形象化成为了业界可能的下一个发展方向。
ps:该工具最好是一个图形化的,可作进行运行时“热修改”的配置定义工具兼Service管理工具,JMX似乎是一个可以考虑的方向,不过还没想清楚如何与该配置工具紧密结合,我只是希望能够象扳动水管开关一样调整各个图形间的连接,系统里的事件流就会随之改变,事务管理,安全控制也会随之改变。不知道哪位同学知道有类似功能的东西,还劳请留个言告知一声。如果没有的话,就只能等本系统告一段落后再来解决这个问题了。如果您正在发愁不知发展方向在哪,看到了这篇文章而有所启发去做出这样一个工具的话,还希望能便宜点卖我一份 ;)。
虽然上面说了那么多,指出了IOC工具的又一个发展方向,但是我目前面临的问题还没有解决 :(
为了展示一下这个复杂度,现在把该系统其中的两个模块的Spring配置show出来:
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>
角色模块的配置:<!-- 组织 -->
<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 <sp>
<!-- 角色 -->
<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 <sp>
相关推荐
李白高力士脱靴李白贺知章告别课本剧.pptx
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
C语言项目之超级万年历系统源码,可以做课程设计参考 文章参考:https://www.qqmu.com/4373.html
Jupyter-Notebook
51单片机加减乘除计算器系统设计(proteus8.17,keil5),复制粘贴就可以运行
《中国房地产统计年鉴》面板数据资源-精心整理.zip
Jupyter-Notebook
Jupyter-Notebook
毕业论文答辩ppt,答辩ppt模板,共18套
Jupyter-Notebook
《中国城市统计年鉴》面板数据集(2004-2020年,最新).zip
Python基础 本节课知识点: • set的定义 • Set的解析 • set的操作 • set的函数
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
兵制与官制研究资料最新版.zip
Jupyter-Notebook
七普人口数据+微观数据+可视化+GIS矢量资源-精心整理.zip
Support package for Hovl Studio assets.unitypackage
土壤数据库最新集.zip
Jupyter-Notebook
1991-2020年中国能源统计年鉴-能源消费量(分省)面板数据-已更至最新.zip