该帖已经被评为新手帖
|
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||
发表时间:2008-03-05
最近工作中涉及到一些将其他项目组的应用整合到我们平台上的事情。刚好那个项目是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官方文档
这也是一个不错的地方。可以省去我们很多地方配置的显示声明。 我们可以看一下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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||
返回顶楼 | |||||||||||||
发表时间:2008-03-05
字太小了啊
|
|||||||||||||
返回顶楼 | |||||||||||||
发表时间:2008-03-05
如果是用firefox的朋友可以按住ctrl+鼠標滾輪滾動....
|
|||||||||||||
返回顶楼 | |||||||||||||
发表时间:2008-03-06
用firefox的话可以放大一下字体就ok了:)
|
|||||||||||||
返回顶楼 | |||||||||||||
发表时间:2008-03-29
大师,正在学习这方面的内容,上面的demo可否发我参考啊,谢谢了。 我的gmai:komeiming@gmail.com
不甚感激!!! |
|||||||||||||
返回顶楼 | |||||||||||||
发表时间:2008-03-31
appfuse...用过才知道多垃圾
|
|||||||||||||
返回顶楼 | |||||||||||||
浏览 4358 次