java

位置:IT落伍者 >> java >> 浏览文章

反思Spring:由Ruby on Rails想到的


发布日期:2018年07月29日
 
反思Spring:由Ruby on Rails想到的
众所周知RoR里面的指导原则有

第一条是较小的软件这意味着你编写较少的程序行程序小就能加速开发错误也较少使得程序较容易理解维护和增强对编写较小程序做出贡献的Ruby的一个特性就是它假设该架构本身能够并应该处理元数据

第二条是对配置的协定原理这意味着Rails不用配置文件而是依靠一些简单的编程协定让它通过利用应用程序已有的信息和在运行的数据库解决它需要知道什么这个问题

Spring一个非常灵活的一个框架灵活的同时也造成了一定的复杂性我个人眼中的spring应该从RoR学到的东西应该有不用写一行xml语句就可以配置好AOP常规的事务管理约定高于配置

当前spring支持的事务管理配置大体有以下两种配置方式为了方便举例子所以借用了javaEE技术专家江南白衣的两段代码

()spring版本支持的事务管理

代码

<bean id=baseTxService class=orgspringframeworktransactioninterceptorTransactionProxyFactoryBean

abstract=true

<property name=transactionManager ref=transactionManager/>

<property name=proxyTargetClass value=true/>

<property name=transactionAttributes

<props>

<prop key=get*>PROPAGATION_REQUIREDreadOnly</prop>

<prop key=find*>PROPAGATION_REQUIREDreadOnly</prop>

<prop key=save*>PROPAGATION_REQUIRED</prop>

<prop key=remove*>PROPAGATION_REQUIRED</prop>

</props>

</property>

<property name=preInterceptors

<list>

<ref bean=methodSecurityInterceptor/>

</list>

</property>

</bean>

<bean id=bookManager parent=baseTxService

<property name=target

<bean class=orgspringsidebookstoreadminmanagerBookManager/>

</property>

</bean>

() spring开始支持事务管理的新配置

代码

<aop:config proxytargetclass=true

<aop:advisor pointcut=execution(*yourpackagename*Manager*()) adviceref=txAdvice/>

<aop:advisor pointcut=execution(*yourpackagename*Managersave()) adviceref=fooAdvice/>

</aop:config><tx:advice id=txAdvice transactionmanager=transactionManager

<tx:attributes>

<tx:method name=save*/>

<tx:method name=remove*/>

<tx:method name=* readonly=true/>

</tx:attributes>

</tx:advice>

<bean id=bookManager class=orgsprimonsserviceBookManager/>

上面的二段配置文件代码是常用的spring事务管理配置

看完上面的二段代码的配置和Ruby on Rails没有一行配置的ActiveRecord相比差太远相对麻烦拖拉没有办法暂时spring实现中事务管理主要也只是这两种方法

使用spring通常会与hibernate/ibatis集成作数据访问层这也是大多java开发人员常用字的技术框架下面如spring和hibernate结合做数据访问层暂时不讨论有泛型存在的情况只是简单举一个例子把事务管理放在数据访问层下面说出我自己心中理想的spring事务管理

约定高于配置首先规定对于querylistshowgetfind等开头的方法采用PROPAGATION_REQUIREDreadOnly级的事务定义而对于setsaveupdateremovedelete等开头的方法采用PROPAGATION_REQUIRED级的事务定义基本上能满足大部分开发的需要然后只要在需要事务管理配置的类的前加一句元数据即可例如spring针对hibernate开发的@TransactionAop(hibernate)类似的有@TransactionAop(hibernate)@TransactionAop(ibatis)@TransactionAop(jdo)之类元数据的

举一个例子看一段代码其中UserDAO是一个接口大家都应该看得出来只加了一行的元数据@TransactionAop(hibernate)就可以使得这一个UserDAHibernate类有事务管理的功能因为它命名的方法符合spring的约定(当然这不是真的spring中也没有这一个功能这只是我个人一点想法提出来而已)

代码

package orgappfusedaohibernate;

import javautilList;

import orgappfusedaoUserDAO;

import orgappfusemodelUser;

import orgspringframeworkormhibernatesupportHibernateDaoSupport;

span > //假设有下面这一个类

import orgspringframeworkormhibernatesupportannotationsTransactionAop; </span>

<span >@TransactionAop(hibernate)</span>

public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO{

public User getUser(Long userId) {

return (User)thisgetHibernateTemplate()get(Userclass userId);

}

public List getUsers() {

return thisgetHibernateTemplate()find(from User);

}

public void removeUser(Long userId) {

Object user = thisgetHibernateTemplate()load(Userclass userId);

thisgetHibernateTemplate()delete(user);

}

public void saveUser(User user) {

thisgetHibernateTemplate()saveOrUpdate(user);

}

}

spring的事务定义很灵活很广定义七种的传播行为和五种的隔离常量但用得比较多还是PROPAGATION_REQUIRED和PROPAGATION_REQUIREDreadOnly所以我提出上面所述的一点假想可以简便开发

简单就是美

上一篇:Struts常见的11个错误汇总

下一篇:E4 Alpha版出炉:下一代Eclipse平台?