科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件Struts Spring Hibernate组装web应用(3)

Struts Spring Hibernate组装web应用(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

这篇文章将讨论怎样组合几个著名的框架去做到松耦合的目的,怎样建立你的构架,怎样让你的各个应用层保持一致。富于挑战的是:组合这些框架使得每一层都以一种松耦合的方式彼此沟通,而与底层的技术无关。这篇文章将使用3种流行的开源框架来讨论组合框架的策略。

作者:网页教学网 来源:网页教学网 2007年8月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

业务层配置

既然我们已经有了领域对象,我们需要有业务服务对象来执行应用逻辑、执行向持久层的调用、获得从用户接口层的请求、处理事务、处理异常。为了将所有这些连接起来并且易于管理,我们将使用Spring框架的bean管理方面。Spring使用“控制反转”,或者“setter依赖注入”来把这些对象连好,这些对象在一个外部的XML文件中被引用。“控制反转”是一个简单的概念,它允许对象接受其它的在一个高一些的层次被创建的对象。使用这种方法,你的对象从必须创建其它对象中解放出来并降低对象耦合。

这儿是个不使用IoC的对象创建它的从属对象的例子,这导致紧的对象耦合:

图2:没有使用IoC的对象组织。对象A创建对象B和C

这儿是一个使用IoC的例子,它允许对象在一个高一些层次被创建和传进另外的对象,所以另外的对象能直接使用现成的对象[译者注:另外的对象不必再亲自创建这些要使用的对象]:





图3:对象使用IoC组织。对象A包含setter方法,它们接受到对象B和C的接口。这也可以用对象A里的接受对象B和C的构建器完成

建立我们的业务服务对象

我们将在我们的业务对象中使用的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的配置。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章