首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于 struts+spring+ibatis 的轻量级 J2EE 开发(3)

基于 struts+spring+ibatis 的轻量级 J2EE 开发(3)

具体的语法请参照附录中的"Spring 中文参考手册"。在这里只简单解释一下:
1.         我们首先创建一个数据源 dataSource,在这里配置的是 hsqldb 数据库。如果是 ORACLE 数据库,driverClassName 的值是"oracle.jdbc.driver.OracleDriver",URL 的值类似于"jdbcracle:thinwugfMobile:1521:cdcf"。数据源现在由 spring 来管理,那么现在我们就可以去掉 properties 目录下 database.properties 这个配置文件了;还有不要忘记修改 sql-map-config.xml,去掉 <properties resource="properties/database.properties"/> 对它的引用。
2.          sqlMapClient 节点。这个是针对 ibatis SqlMap 的 SqlMapClientFactoryBean 配置。实际上配置了一个 sqlMapClient 的创建工厂类。configLocation 属性配置了 ibatis 映射文件的名称。dataSource 属性指向了使用的数据源,这样所有使用 sqlMapClient 的 DAO 都默认使用了该数据源,除非在 DAO 的配置中另外显式指定。
3.          TransactionManager 节点。定义了事务,使用的是 DataSourceTransactionManager。
4.         下面就可以定义 DAO 节点了,如 AccountDao,它的实现类是 com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao,使用的 SQL 配置从 sqlMapClient 中读取,数据库连接没有特别列出,那么就是默认使用 sqlMapClient 配置的数据源 datasource。
这样,我们就把持久层改造完了,其他的 DAO 配置类似于 AccountDao。怎么样?简单吧。这次有接口了:) AccountDao 接口->AccountSqlMapDao 实现。
3.5.         业务层业务层的位置以及相关类,如下图所示:
在这个例子中只有 3 个业务类,我们以 OrderService 类为例来改造,这个类是最复杂的,其中涉及了事务。
1、在 ApplicationContext 配置文件中增加 bean 的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<bean id="OrderService"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref local="TransactionManager"></ref>
    </property>
    <property name="target">
        <bean class="com.ibatis.jpetstore.service.OrderService">
            <property name="itemDao">
                <ref bean="ItemDao"/>
            </property>
            <property name="orderDao">
                <ref bean="OrderDao"/>
            </property>
            <property name="sequenceDao">
                <ref bean="SequenceDao"/>
            </property>
        </bean>
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="insert*">ROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>




定义了一个 OrderService,还是很容易懂的。为了简单起见,使用了嵌套 bean,其实现类是 com.ibatis.jpetstore.service.OrderService,分别引用了 ItemDao,OrderDao,SequenceDao。该 bean 的 insert* 实现了事务管理 (AOP 方式 )。TransactionProxyFactoryBean 自动创建一个事务 advisor, 该 advisor 包括一个基于事务属性的 pointcut, 因此只有事务性的方法被拦截。
2、业务类的修改
以 OrderService 为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class OrderService {
   /* Private Fields */
  private ItemDao itemDao;
  private OrderDao orderDao;
  private SequenceDao sequenceDao;
  /* Constructors */
  public OrderService() {
  }
/**
* @param itemDao 要设置的 itemDao。
*/
public final void setItemDao(ItemDao itemDao) {
     this.itemDao = itemDao;
}
/**
* @param orderDao 要设置的 orderDao。
*/
public final void setOrderDao(OrderDao orderDao) {
     this.orderDao = orderDao;
}
/**
* @param sequenceDao 要设置的 sequenceDao。
*/
public final void setSequenceDao(SequenceDao sequenceDao) {
     this.sequenceDao = sequenceDao;
}
// 剩下的部分
…… .
}




红色部分为修改部分。Spring 采用的是 Type2 的设置依赖注入,所以我们只需要定义属性和相应的设值函数就可以了,ItemDao,OrderDao,SequenceDao 的值由 spring 在运行期间注入。构造函数就可以为空了,另外也不需要自己编写代码处理事务了(事务在配置中声明),daoManager.startTransaction(); 等与事务相关的语句也可以去掉了。和原来的代码比较一下,是不是处理精简了很多!可以更关注业务的实现。
返回列表