风云之颠

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  1 Posts :: 2 Stories :: 0 Comments :: 0 Trackbacks

2007年1月11日 #

建立我们的业务服务对象

  我们将在我们的业务对象中使用的setter方法接受的是接口,这些接口允许对象的松散定义的实现,这些对象将被设置或者注入。在我们这个例子里我们将使我们的业务服务对象接受一个DAO去控制我们的领域对象的持久化。当我们在这篇文章的例子中使用Hibernate,我们可以容易的转换到一个不同的持久框架的实现,通知Spring使用新的实现的DAO对象。你能明白编程到接口和使用“依赖注入”模式是怎样宽松耦合你的业务逻辑和你的持久化机制的。

  这儿是业务服务对象的接口,它是一个DAO对象依赖的桩.
public interface IOrderService {
 public abstract Order saveNewOrder(Order order)
  throws OrderException,
      OrderMinimumAmountException;
 public abstract List findOrderByUser(String user)
              throws OrderException;
 public abstract Order findOrderById(int id)
              throws OrderException;
 public abstract void setOrderDAO(IOrderDAO orderDAO);
}

  注意上面的代码有一个为DAO对象准备的setter方法。这儿没有一个getOrderDAO方法因为它不是必要的,因为不太有从外面访问连着的OrderDAO对象的需要。DAO对象将被用来和我们的持久层沟通。我们将用Spring把业务服务对象和DAO对象连在一起。因为我们编码到接口,我们不会紧耦合实现。

  下一步是写我们的DAO实现对象。因为Spring有内建的对Hibernate的支持,这个例子DAO将继承HibernateDaoSupport类,这使得我们容易取得一个到HibernateTemplate类的引用,HibernateTemplate是一个帮助类,它能简化Hibernate Session的编码和处理HibernateExceptions。这儿是DAO的接口:

public interface IOrderDAO {
 public abstract Order findOrderById(final int id);
 public abstract List findOrdersPlaceByUser(final String placedBy);
 public abstract Order saveOrder(final Order order);
}

  我们还有两个对象要和我们的业务层连在一起。这包括HibernateSessionFactory和一个TransactionManager对象。这在Spring配置文件里直接完成。Spring提供一个HibernateTransactionManager,它将从工厂绑定一个Hibernate Session到一个线程来支持事务。这儿是HibernateSessionFactory和HibernateTransactionManager的Spring配置。

<bean id="mySessionFactory"
    class="org.springframework.orm.hibernate.
       LocalSessionFactoryBean">
 <property name="mappingResources">
  <list>
   <value>
    com/meagle/bo/Order.hbm.xml
   </value>
   <value>
    com/meagle/bo/OrderLineItem.hbm.xml
   </value>
  </list>
 </property>
 <property name="hibernateProperties">
  <props>
   <prop key="hibernate.dialect">
    net.sf.hibernate.dialect.MySQLDialect
   </prop>
   <prop key="hibernate.show_sql">
    false
   </prop>
   <prop key="hibernate.proxool.xml">
    C:/MyWebApps/.../WEB-INF/proxool.xml
   </prop>
   <prop key="hibernate.proxool.pool_alias">
     spring
   </prop>
  </props>
 </property>
</bean>
<!-- Transaction manager for a single Hibernate
SessionFactory (alternative to JTA) -->
<bean id="myTransactionManager"
     class="org.
         springframework.
        orm.
        hibernate.
        HibernateTransactionManager">
 <property name="sessionFactory">
  <ref local="mySessionFactory"/>
 </property>
 </bean>

  每一个对象能被Spring配置里的一个<bean>标记引用。在这个例子里,bean “mySessionFactory”代表一个HibernateSessionFactory,bean “myTransactionManager”代表一个Hibernate transaction manager。注意transactionManger bean有一个叫作sessionFactory的属性元素。HibernateTransactionManager有一个为sessionFactory准备的setter和getter方法,它们是用来当Spring容器启动时的依赖注入。sessionFactory属性引用mySessionFactory bean。这两个对象现在当Spring容器初始化时将被连在一起。这种连接把你从为引用和创建这些对象而创建singleton对象和工厂中解放出来,这减少了你应用程序中的代码维护。mySessionFactory bean有两个属性元素,它们翻译成为mappingResources 和 hibernatePropertes准备的setter方法。通常,如果你在Spring之外使用Hibernate,这个配置将被保存在hibernate.cfg.xml文件中。不管怎样,Spring提供了一个便捷的方式--在Spring配置文件中合并Hibernate的配置。

  既然我们已经配置了我们的容器服务beans和把它们连在了一起,我们需要把我们的业务服务对象和我们的DAO对象连在一起。然后,我们需要把这些对象连接到事务管理器。

  这是在Spring配置文件里的样子:

<!-- ORDER SERVICE -->
<bean id="orderService"
 class="org.
     springframework.
     transaction.
     interceptor.
     TransactionProxyFactoryBean">
 <property name="transactionManager">
  <ref local="myTransactionManager"/>
 </property>
 <property name="target">
  <ref local="orderTarget"/>
 </property>
 <property name="transactionAttributes">
  <props>
   <prop key="find*">
  PROPAGATION_REQUIRED,readOnly,-OrderException
   </prop>
   <prop key="save*">
  PROPAGATION_REQUIRED,-OrderException
   </prop>
  </props>
 </property>
</bean>
<!-- ORDER TARGET PRIMARY BUSINESS OBJECT:
Hibernate implementation -->
<bean id="orderTarget"
     class="com.
        meagle.
        service.
        spring.
        OrderServiceSpringImpl">
 <property name="orderDAO">
  <ref local="orderDAO"/>
 </property>
</bean>
<!-- ORDER DAO OBJECT -->
<bean id="orderDAO"
     class="com.
        meagle.
        service.
        dao.
        hibernate.
        OrderHibernateDAO">
 <property name="sessionFactory">
  <ref local="mySessionFactory"/>
 </property>
</bean>

  图4是我们已经连在一起的东西的一个概览。它展示了每个对象是怎样相关联的和怎样被Spring设置进其它对象中。把这幅图和示例应用中的Spring配置文件对比查看它们之间的关系。


图4:这是Spring怎样将在这个配置的基础上装配beans。

  这个例子使用一个TransactionProxyFactoryBean,它有一个为我们已经定义了的事务管理者准备的setter方法。这是一个有用的对象,它知道怎样处理声明的事务操作和你的服务对象。你可以通过transactionAttributes属性定义事务怎样被处理,transactionAttributes属性为方法名定义模式和它们怎样参与进一个事务。

  TransactionProxyFactoryBean类也有一个为一个target准备的setter,target将是一个到我们的叫作orderTarget的业务服务对象的引用。 orderTarget bean定义使用哪个业务服务对象并有一个指向setOrderDAO()的属性。orderDAO bean将居于这个属性中,orderDAO bean是我们的和持久层交流的DAO对象。

  还有一个关于Spring和bean要注意的是bean能以两种模式工作。这两种模式被定义为singleton和prototype。一个bean默认的模式是singleton,意味着一个共享的bean的实例将被管理。这是用于无状态操作--像一个无状态会话bean将提供的那样。当bean由Spring提供时,prototype模式允许创建bean的新实例。你应当只有在每一个用户都需要他们自己的bean的拷贝时才使用prototype模式。
posted @ 2007-01-11 15:02 付翔 阅读(179) | 评论 (0)编辑 收藏