最近工作中涉及到一些将其他项目组的应用整合到我们平台上的事情。刚好那个项目是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
分享到:
相关推荐
Struts1.2+Struts2.1.6+spring 2.0+hibernate3.1+Ibatis2.3 SSH
Struts2、Spring2.0和Hibernate3.0是经典的Java EE开发框架组合,被称为SSH(Struts2、Spring、Hibernate)集成框架。这个组合在2000年代末到2010年代初非常流行,为开发企业级Web应用程序提供了强大的支持。现在,...
Struts1.x、Spring2.0 和 Hibernate3.0 是经典的 Java Web 开发框架组合,被称为 SSH(Struts + Spring + Hibernate)。这个组合在过去的十几年里被广泛应用,为开发人员提供了一个强大的、全面的企业级应用解决方案...
在这个"struts2.0+sping2.0在线书店项目"中,我们可以深入理解这两个框架的集成与应用。 **Struts2.0** 是一个基于MVC(Model-View-Controller)设计模式的开源Web框架,它极大地简化了Java Web应用的开发。Struts2...
标题 "sping4+struts2+mybatis 的jar包" 描述了这个压缩包包含的是用于构建Java Web应用程序的核心库,主要涉及Spring框架的第四个版本(Spring 4)、Struts2框架以及MyBatis持久层框架。这些组件协同工作,能够帮助...
SSH 框架集成,实现 简单的用户登陆和注册功能(内涵相关jar包 Sping4.1+Struts2.3+Hibernate4.3+MySQL驱动5.1).适合初学SSH框架的学者,供参考和学习。 注:内不包含MySQL数据库的相关表,建议运行环境在JDK 1.7...
Struts2、MyBatis和Spring是Java Web开发中常用的三大框架,它们组合起来可以构建出高效、可维护的Web应用程序。在这个实例中,我们主要关注的是如何在Struts2框架下实现文件上传功能,并结合MyBatis进行数据持久化...
Struts2、Spring3和iBATIS是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作可以构建出高效、松耦合的Web应用。在这个“struts2+spring3+ibatis项目整合案例”中,我们将深入探讨这三个框架如何...
《Spring 2.0、Struts 1.3.8、JavaEE 5 API与MySQL 5 开发指南》 本指南将详细讲解基于Spring 2.0、Struts 1.3.8、JavaEE 5 API以及MySQL 5进行Web应用开发的关键技术和实践方法。这四个组件在企业级应用开发中扮演...
Spring、Hibernate和Struts是Java开发中的三大核心技术,它们各自负责不同的职责,共同构建了企业级Web应用的基础架构。Spring作为一个全面的框架,提供依赖注入(DI)和面向切面编程(AOP),使得代码更加模块化...
【标题】"eclipse + struts2+sping + bootstrap+juqery-ui整合源码"涉及的关键技术栈包括Eclipse开发环境、Struts2框架、Spring框架、Bootstrap前端库以及jQuery UI组件库。这些技术在Java Web开发中占据着重要地位...
总结来说,Spring、Struts和Hibernate的结合使用,旨在提供一个灵活、可扩展且易于维护的Java Web应用程序开发框架。它们分别在不同层次上解决了控制流程管理、业务逻辑处理和数据库操作的问题,共同构成了Java开发...
Spring、Hibernate和Struts是Java Web开发中的三大框架,它们的结合使用被称为SSH(Spring、Struts、Hibernate)架构,广泛应用于企业级应用的开发。这个项目是一个基于SSH的文件管理系统,虽然目前只实现了大部分...
在现代Web应用开发中,SSH(Struts2、Spring、Hibernate)框架因其各自独特的功能和优势,常被组合使用以构建高效、稳定且易于维护的系统。以下是针对SSH框架整合的具体实施步骤和思路。 #### 二、整合步骤详解 ##...
在IT行业中,Spring、Hibernate和Struts2是三个非常重要的框架,它们构成了经典的Java Web开发栈,被广泛用于实现Web应用程序的"增删改查"(CRUD)操作。在这个项目中,"北大青鸟"可能是一个教育机构,它可能在教授...
本程序采用struts2.0+spring2.5+hiberhate3架构开发。 主要展示技术包括:三层架构 freemarker模版 面向切面编程 邮件发送 定时任务 缓存管理 运行环境: 1 TOMCAT 5.5及以上版本. 2 JDK5.0及以上版本. 3 ...
Struts2、Hibernate3.1和Spring2.0是Java Web开发中三个非常重要的框架,它们的整合(通常称为SSH2)可以实现MVC(Model-View-Controller)设计模式,提供强大的数据持久化能力以及灵活的依赖注入。在这个例子中,...
本程序采用struts2.0+spring2.5+hiberhate3架构开发。 主要展示技术包括:三层架构 freemarker模版 面向切面编程 邮件发送 定时任务 缓存管理 运行环境: 1 TOMCAT 5.5及以上版本. 2 JDK5.0及以上版本. 3 ...
Spring、Spring MVC 和 Hibernate 是Java开发中非常流行的三大框架,它们通常被组合使用,被称为SSH框架,用于构建高效、模块化的Web应用程序。Spring是整个应用的基础,提供了依赖注入(DI)和面向切面编程(AOP)...
sping + ibatissping + ibatissping + ibatissping + ibatissping + ibatissping + ibatissping + ibatissping + ibatis