中国开发网: 论坛: 程序员情感CBD: 贴子 232144
nostalgic
俺使用Spring 的体会
一、 Spring 的作用:
问:Spring用来做什么?
答: 1、取代基础工厂类,在线程安全的情况下避免同一个类在系统中重复创建。
2、用于进行统一的事务管理,无须在代码中指定DataSource实例。
3、减少代码量,提高生产率。
4、……(Spring 在J2EE各层实际上均有支持,但是一般是用到的功能主要是为了做上面三件事)
虽然上面的回答看起来比较粗浅,而一般教材中Spring的特性介绍也是琳琅满目但是在项目中确实没有用到其它的特性。

问:为什么使用Spring可以取代基础工厂类?
答:Spring Framework中使用了控制反转(IOC =Inverse Of Control)或者依赖注入(DI =Dependence Injection)的设计思想,理解这种思想是理解Spring的关键所在。
IoC是从发出控制指令者的角度定义的,指的是控制权由应用代码中转移到了外部容器。
DI是从组件的产生与作用的过程定义的,指组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
所以IoC和DI 其实是从不同的角度说的同一件事情,因此,这种设计模式经常被称为IoC/DI模式。
我们以前利用基础工厂类BaseObjectFactory体现的实际上也是这一思想。在实际的应用过程中,在这一点上我觉两种方式做的是一样好,所要做的工作也相差无几。

问:Spring如何进行事务管理,与传统架构的事务控制机制相比有什么优势?
答:先回忆一下传统的事务控制方法:事务在业务逻辑层创建和向下传递,在创建事务时要判断之前没有事务被创建,在提交、回滚、结束事务时需要确定事务是在本方法内创建的。因此,每个业务逻辑层的方法中都要加入这十几行完全一样的代码,而且这部分工作与业务逻辑本身毫无关联。而Spring 为我们提供了一种Template模式。请看如下代码,
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
exampleDao.insertExampleEntity(jdbcTemplate,exampleEntity);
上面两句代码已经可以完成创建、提交、回滚、结束事务的所有动作。但是上面的方法还是不够简洁,因为我们在业务逻辑层的方法中仍然少许的涉及了事务的处理。针对这种情况,Spring提供的解决方案是把事务的控制完全放到容器中处理(这里正是IoC设计思想的展示),而程序中只需要关心业务逻辑。下面是配置文件中几段与事务控制相关的内容。
<beans>
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean"
destroy-method="close">
<property name="jndiName">
<value>jdbc/SinotransOcsOraclePool</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransac
tionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="pro*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="exampleBiz" parent="baseTransactionProxy">
<property name="target">
<bean class="com.iss.scm.example.bizlogic.exampleBiz ">
<property name="exampleDao">
<ref bean="exampleDao"/>
</property>
</bean>
</property>
</bean>
</beans>
而在程序中,我们只需要完成业务逻辑就可以了,如下:
public void insertExampleEntity(exampleEntity) throws DataAccessException {
exampleDao.updateExampleEntity(exampleEntity);
exampleDao.insertExampleEntity(exampleEntity);
}

问:减少了哪些代码量?
答:与传统的方式相比, 减少了业务逻辑层事务每个方法中控制代码的处理,减少了业务逻辑层方法中异常的处理(异常可以在控制层中统一捕获进行处理)。
二、 Spring 在项目中的使用:
前面已经提到过,笔者所在项目组使用的架构是Struts+Spring+iBatis,下面将要介绍的是Spring与数据持久层,Spring与控制层的结合。

问:Spring可以与哪些持久层框架进行结合,是如何结合的?
答:Spring可以与iBatis、Hibernate等进行很好的结合,同时对JDBC,JTA这两种方式进行了很好的封装。因为业务逻辑层与数据持久层的交互无非是做到能够按照业务要求从数据库中取得数据,更新、修改业务逻辑层传入持久层的数据,删除业务逻辑层所要求的数据,并能够对这些操作进行事务管理。所以无论数据持久层是用什么做到的,业务逻辑层只要能够初始化数据持久层,并能够通过接口的参数和返回值将数据传入传出,并保证这些操作是在一个事务中进行的。前面已经描述过Spring的事务管理,这里要补充的内容是对数据持久层接口的实例化。还是看上面配置文件中的一段内容:
<bean class="com.iss.scm.example.bizlogic.exampleBiz ">
<property name="exampleDao">
<ref bean="exampleDao"/>
</property>
</bean>
在这段内容里,exampleDao是数据持久层实现类的id,对应的具体实现是哪个类在accessContext.xml文件中进行配置,业务逻辑层exampleBiz实例化的时候数据持久层exampleDao也作为属性被同时实例化。需要再次强调的是这并不是唯一的实例化方式,前面提到的Template模式同样可以做到这一点。

问:Spring可以与哪些控制层框架进行结合,是如何结合的?
答:我的理解是只要控制层设计得足够好,Spring 可以与任何的控制层框架相结合。因为从控制层与业务逻辑层的交互过程来看,由控制层实例化业务逻辑类,将视图层提交的数据作为参数交给业务逻辑层处理,最后从业务逻辑层取得处理结果。交互的要素无非是对应的业务逻辑类以及业务数据。这两个信息对于任何控制层框架而言都是可以轻松取得的。
三、 由Spring想到的:
问:Spring是必须的吗? 
答:Spring Framework为了提供上面谈到的功能已经提供了大量的支持组件,如果使用Spring,我们不需要写什么基础类就可以很轻松的做到。但是需要明确一点,为了达到上述目标,Spring并不是一个不可替代的方案,实际上只要有更好的结构,我们完全可以做的比Spring更好。我们回头再看一下上面第一个问题里谈到的Spring的四点作用:
1、 基础工厂类:在上面的分析中,我们已经得出结论,基础工厂类在体现IoC/DI的设计思想方面与Spring相比并不存在劣势。
2、 事务管理:在我们绝大多数的业务里,同一个控制器方法中只存在一个事务,因此我们可以把Action这个动作与各个控制器相分离,事务的产生,提交 ,回滚,结束可以全部在这个基础的Action类中进行。而这个Action可以像组件一样使用,不需要开发人员维护。结果就是DataSource的创建以及事务的管理也不再需要在业务逻辑类的方法中去做了。
3、 减少代码量:因为事务已经统一管理,所以这部分的代码实际上已经可以精简掉了,对于异常,同样可以在上面基础的Action中进行统一处理。而且这种替代架构还可以减少对xml文件的编写。从实际应用的角度看,这种替代架构还是比较有优势。
4、 Spring的其它组件:这些组件本来就有很多的替代方案可以选择。
因为项目的特殊项目情况,这套替代框架在项目中也在使用,与Spring相比,并不存在什么劣势,因为各个层次定义的比较清晰,这套架构与Spring还可以进行很好的合作。
综上,Spring确实是一套非常优秀的架构,它极大地加快了代码开发速度,节约了项目成本。在学习和使用Spring 的过程中,最重要的还是掌握其核心思想,结合项目的实际情况,有选择的使用。
这篇文章是我在使用Spring过程中的一些体会,如果其中有理解不准确,或者描述不清楚的地方,希望大家能够指正。

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录