Sping2.0 + Struts2.0 +Ibatis 的使用总结

本文介绍如何将Spring2.0与Struts2.0整合,并探讨了使用AspectJ风格的切面事务控制,以及如何配置Struts2.0以利用Spring的IOC容器进行自动装配。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

最近工作中涉及到一些将其他项目组的应用整合到我们平台上的事情。刚好那个项目是base在Appfuse提供的框架基础上开发的。使用了Spring2.0 + Struts2.0 + Ibatis的框架。趁此机会把这几个外面现在比较流行的东西又好好看了看。现在写个总结。也希望能便于以后的参考。好了,元归正传,开始我们的SSI之旅。

         我们还是从代码讲起。这样也便于我们理解。否则High Level的东西说了一通到最后也不知道都说明了什么。

         先看几段代码:

         Spring DataSoure:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="${jdbc.driverClassName}"/>

        <property name="url" value="${jdbc.url}"/>

        <property name="username" value="${jdbc.username}"/>

        <property name="password" value="${jdbc.password}"/>

        <property name="maxActive" value="${jdbc.maxActive}"/>

        <property name="maxIdle" value="${jdbc.maxIdle}"/>

        <property name="maxWait" value="${jdbc.maxWait}"/>

        <property name="defaultAutoCommit" value="true"/>

        <property name="removeAbandoned" value="true"/>

        <property name="removeAbandonedTimeout" value="60"/>

        <!-- 以下配置用于开发时追踪没有释放数据库连接的代码,部署时应删除 -->

        <property name="logAbandoned" value="true"/>

 </bean>

         这里我们使用dbcp连接池。这里就不多说了。

         Spring AOP Configuration:

         <bean id="txManager"

         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

         <property name="dataSource">

              <ref bean="dataSource"/>

         </property>

     </bean>

     <tx:advice id="txAdvice" transaction-manager="txManager">

         <!-- the transactional semantics... -->

         <tx:attributes>

              <!-- all methods starting with 'get' are read-only -->

              <tx:method name="get*" read-only="true" />

              <!-- other methods use the default transaction settings (see below) -->

              <tx:method name="*" rollback-for="Exception" />

         </tx:attributes>

     </tx:advice>

 

     <aop:config>

         <aop:pointcut id="serviceOperation"

              expression="execution(* com.ibm.magis..service.*Manager.*(..))" />

         <aop:advisor advice-ref="txAdvice"

              pointcut-ref="serviceOperation" />

     </aop:config>

         这里就和我们以前用的Spring就不一样了。这里我们使用的是AspectJ 的切面事务的统一控制。 Spring的官方文档说:“如果你选择使用Spring AOP,那么你可以选择@AspectJ或者XML风格。总的来说,如果你使用Java 5我们建议使用@AspectJ风格。”当然项目中使用的是JDK1.5 所以他使用了这样的声明方式。

         回头看一下我们以前的方法:

             <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

         <property name="transactionManager">

              <ref bean="transactionManager" />

         </property>

         <property name="transactionAttributes">

              <props>

<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>

<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>

<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>

<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

              </props>

         </property>

</bean>

         两者相比较而言还是AspectJ的这种风格比较好。而且我们可以方边在Spring中定义我们自己的切面。例如日志的记录、权限的检查等等。

              <aop:config>

         <aop:aspect id="objectACLAspectU" ref="objectACLAdviceU">

              <aop:pointcut id="objectRemovePcU" expression="execution(* com.ibm.magis.data.instance.service.OinstanceManager.remove(..)) and args(objectId,instanceId)"/>

         </aop:aspect>

     </aop:config>

     <bean id="objectACLAdviceU" class="com.ibm.magis.acl.advice.ObjectACLUsingAdvice">

       <property name="oinstanceManager" ref="oinstanceManager"/>

       <property name="objectACLManager" ref="objectACLManager"/>

     </bean>

         经过简单的配置在加上一个简单的实现类就可以完成一些复杂的切面控制的代码了。

         看完上面Spring2.0的AOP后。在看一个配置文件:

              <beans default-autowire="byName" default-lazy-init="true">

            <bean id="objectACLDao" class="com.ibm.magis.acl.dao.ibatis.PObjectACLDaoImpl" />

</beans>

         注意这个属性default-lazy-init. 如果设置为true 则表明Spring 的IOC容器使用Lazy-load的方式进行加载。这种懒加载的方式可从某种情况下提高启动的速度。但是也会有一个问题哦。可能不会马上发现配置错误的bean.

         还有一个属性:default-autowire="byName" 设置Spring的自动装配方式。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥!

         载至Spring官方文档

模式

说明

no

不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。

byName

根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

byType

如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。

constructor

byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

autodetect

通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

         这也是一个不错的地方。可以省去我们很多地方配置的显示声明。

我们可以看一下Struts2.0的使用吧。个人认为其实Struts2.0就是完全照搬的webwork的。没有多少自己的心意。

         具体的配置就不多说了。主要是看看下面这个配置文件:

<constant name="struts.i18n.encoding" value="UTF-8"/>

    <constant name="struts.action.extension" value="action"/>

    <constant name="struts.objectFactory" value="spring"/>

         注意<constant name="struts.objectFactory" value="spring"/>

这里它将框架常量struts.objectFactory覆盖了,设置为”spring”,其实这里是使用了缩写,我们可以写全称:org.apache.struts2.spring.StrutsSpringObjectFactory。这个缩写的”spring”是和bean配置中的name属性相对应的。默认情况下所有由框架创建的对象都是由ObjectFactory实例化的,ObjectFactory提供了与其它IoC容器如Spring、Pico等集成的方法。覆盖这个ObjectFactory的类必须继承ObjectFactory类或者它的任何子类,并且要带有一个不带参数的构造方法。在这里我们用org.apache.struts2.spring.StrutsSpringObjectFactory代替了默认的ObjectFactory。

此外,上面我们说了,如果action不是使用Spring ObjectFactory创建的话,插件提供了两个拦截器来自动装配action,默认情况下框架使用的自动装配策略是name,也就是说框架会去Spring中寻找与action属性名字相同的bean,可选的装配策略还有:type、auto、constructor,我们可以通过常量struts.objectFactory.spring.autoWire来进行设置。

这样的话,我们就可以在Action中使用Spring IOC中注入的Bean了。其实这是webwork早有的扩展包里的功能。呵呵。换成strut2.0了还是得说一下。

有了上面的配置文件我们就可以把Spring2.0 和 struts2.0 结合起来了。

看看IBatis 的配置文件:

<!-- SqlMap setup for iBATIS Database Layer -->

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

        <property name="configLocation">

            <value>classpath:/sql-map-config.xml</value>

        </property>

        <property name="dataSource" ref="dataSource"/>

 </bean

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

下载代码方式:https://pan.quark.cn/s/a4b39357ea24 依据所提供的资料,我们深入剖析此问题以及所给出的两种算法方案。 ### 问题背景 该问题源自王晓东编撰的《算法设计与实验题解》一书,书中阐述了一个值得注意的数学议题:针对一本页码从1到n顺序编号的书籍,要求统计所有页码中数字0至9各自出现的频次。例如,若n=13,则页码序列为1、2...、13,其中数字1出现5次(体现在1、10、11、12、13中),数字0出现1次(体现在10中)。 ### 问题描述 具体而言,我们需要开发一种算法,其输入参数为一个正整数n,输出结果需为0至9这十个数字各自出现的频次。所有页码均以十进制形式呈现,且不包含任何前导零,即不会出现如006之类的页码表示。 ### 解决方案一:时间复杂度为O(n*log10(n))的算法 首先,介绍一种时间复杂度为O(n*log10(n))的算法实现。其核心构思在于遍历从1到n的每一个数值,然后逐一分解每个数值的各个位,并统计各类数字出现的频次。具体步骤如下: 1. 初始化一个长度为10的数组`count`,用于记录0至9每个数字出现的频次,初始值均为02. 从1开始遍历至n,对于每一个数值i,将其转换为整数并进行以下操作: - 利用循环结构,持续将当前数值除以10,获取余数(即当前最低位的数字),并累加到对应的计数器中。 3. 遍历完成后,输出`count`数组中的每一个元素,即为所求的结果。 ### 解决方案二:优化算法 为了提升效率,提出了一种更为优越的算法。该算法基于以下观察:在1到10^n-1之间的任意区间内,每一种数字0至9出现的频次是相等的。例如,在1到999之间,每一种数字0至9出现的频次均相...
内容概要:本文档详细介绍了基于直驱永磁同步发电机(PMSG)的1.5MW风力发电系统在Simulink环境下的建模与仿真方法,涵盖风力机、传动系统、PMSG本体及电力电子变换器等核心组件的数学建模与系统集成。通过构建完整的风电系统仿真平台,实现了对风速扰动、机械动力学响应、电磁能量转换及并网运行特性的动态模拟,重点解析了PMSG在不同工况下的运行行为与先进控制策略的设计与实现,如最大功率点跟踪(MPPT)和矢量控制技术。该模型不仅可用于风电系统的性能评估与优化,还可作为控制器设计与算法验证的有效工具,支持新能源领域的教学、科研与工程应用。; 适合人群:具备电力系统、电机控制或可再生能源发电等相关背景的科研人员、工程技术人员及高校研究生;熟悉MATLAB/Simulink仿真环境者尤佳。; 使用场景及目标:①开展风力发电系统的动态特性分析与先进控制策略研究;②完成课程设计、学位论文或科研项目中的系统建模任务;③复现高水平学术论文中的风电仿真案例,支撑科研成果的验证与发表。; 阅读建议:建议结合文档中提到的相关控制算法与优化策略进行拓展学习,重点关注模型结构搭建、参数配置与仿真调试过程,并通过改变风速输入、负载条件等变量开展多工况仿真实验,深入理解系统动态响应机制与控制效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值