﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-风云之颠</title><link>http://www.blogjava.net/fengyun1801/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 03:57:28 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 03:57:28 GMT</pubDate><ttl>60</ttl><item><title>Struts+Spring+Hibernate组装web应用</title><link>http://www.blogjava.net/fengyun1801/archive/2007/01/11/93173.html</link><dc:creator>付翔</dc:creator><author>付翔</author><pubDate>Thu, 11 Jan 2007 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/fengyun1801/archive/2007/01/11/93173.html</guid><wfw:comment>http://www.blogjava.net/fengyun1801/comments/93173.html</wfw:comment><comments>http://www.blogjava.net/fengyun1801/archive/2007/01/11/93173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengyun1801/comments/commentRss/93173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengyun1801/services/trackbacks/93173.html</trackback:ping><description><![CDATA[
		<strong>建立我们的业务服务对象<br /><br /></strong>　　我们将在我们的业务对象中使用的setter方法接受的是接口，这些接口允许对象的松散定义的实现，这些对象将被设置或者注入。在我们这个例子里我们将使我们的业务服务对象接受一个DAO去控制我们的领域对象的持久化。当我们在这篇文章的例子中使用Hibernate，我们可以容易的转换到一个不同的持久框架的实现，通知Spring使用新的实现的DAO对象。你能明白编程到接口和使用“依赖注入”模式是怎样宽松耦合你的业务逻辑和你的持久化机制的。<br /><br />　　这儿是业务服务对象的接口，它是一个DAO对象依赖的桩. 
<table style="WIDTH: 663px; HEIGHT: 200px" width="663" align="center" border="1"><tbody><tr><td class="main" bgcolor="#e6e6fa">public interface IOrderService {<br />　public abstract Order saveNewOrder(Order order)<br />　　throws OrderException,<br />　　　　　 OrderMinimumAmountException;<br />　public abstract List findOrderByUser(String user)<br />　　　　　　　　　　　　　 throws OrderException;<br />　public abstract Order findOrderById(int id)<br />　　　　　　　　　　　　　 throws OrderException;<br />　public abstract void setOrderDAO(IOrderDAO orderDAO);<br />} </td></tr></tbody></table><br />　　注意上面的代码有一个为DAO对象准备的setter方法。这儿没有一个getOrderDAO方法因为它不是必要的，因为不太有从外面访问连着的OrderDAO对象的需要。DAO对象将被用来和我们的持久层沟通。我们将用Spring把业务服务对象和DAO对象连在一起。因为我们编码到接口，我们不会紧耦合实现。 <br /><br />　　下一步是写我们的DAO实现对象。因为Spring有内建的对Hibernate的支持，这个例子DAO将继承HibernateDaoSupport类，这使得我们容易取得一个到HibernateTemplate类的引用，HibernateTemplate是一个帮助类，它能简化Hibernate Session的编码和处理HibernateExceptions。这儿是DAO的接口： <br /><br /><table style="WIDTH: 657px; HEIGHT: 124px" width="657" align="center" border="1"><tbody><tr><td class="main" bgcolor="#e6e6fa">public interface IOrderDAO { <br />　public abstract Order findOrderById(final int id);<br />　public abstract List findOrdersPlaceByUser(final String placedBy);<br />　public abstract Order saveOrder(final Order order);<br />} </td></tr></tbody></table><br />　　我们还有两个对象要和我们的业务层连在一起。这包括HibernateSessionFactory和一个TransactionManager对象。这在Spring配置文件里直接完成。Spring提供一个HibernateTransactionManager，它将从工厂绑定一个Hibernate Session到一个线程来支持事务。这儿是HibernateSessionFactory和HibernateTransactionManager的Spring配置。 <br /><br /><table style="WIDTH: 657px; HEIGHT: 808px" width="657" align="center" border="1"><tbody><tr><td class="main" bgcolor="#e6e6fa">＜bean id="mySessionFactory"<br />　　　 class="org.springframework.orm.hibernate.<br />　　　　　　　LocalSessionFactoryBean"＞<br />　＜property name="mappingResources"＞ <br />　　＜list＞ <br />　　　＜value＞<br />　　　　com/meagle/bo/Order.hbm.xml<br />　　　＜/value＞<br />　　　＜value＞<br />　　　　com/meagle/bo/OrderLineItem.hbm.xml<br />　　　＜/value＞<br />　　＜/list＞<br />　＜/property＞<br />　＜property name="hibernateProperties"＞<br />　　＜props＞<br />　　　＜prop key="hibernate.dialect"＞<br />　　　　net.sf.hibernate.dialect.MySQLDialect<br />　　　＜/prop＞<br />　　　＜prop key="hibernate.show_sql"＞<br />　　　　false<br />　　　＜/prop＞<br />　　　＜prop key="hibernate.proxool.xml"＞<br />　　　　C:/MyWebApps/.../WEB-INF/proxool.xml<br />　　　＜/prop＞<br />　　　＜prop key="hibernate.proxool.pool_alias"＞<br />　　　　　spring<br />　　　＜/prop＞<br />　　＜/props＞<br />　＜/property＞<br />＜/bean＞<br />＜!-- Transaction manager for a single Hibernate<br />SessionFactory (alternative to JTA) --＞<br />＜bean id="myTransactionManager"<br />　　　　 class="org.<br />　 　　　　　　 springframework.<br />　　　　　　　　orm.<br />　　　　　　　　hibernate.<br />　　　　　　　　HibernateTransactionManager"＞<br />　＜property name="sessionFactory"＞<br />　　＜ref local="mySessionFactory"/＞<br />　＜/property＞<br />　＜/bean＞ </td></tr></tbody></table><br />　　每一个对象能被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的配置。 <br /><br />　　既然我们已经配置了我们的容器服务beans和把它们连在了一起，我们需要把我们的业务服务对象和我们的DAO对象连在一起。然后，我们需要把这些对象连接到事务管理器。<br /><br />　　这是在Spring配置文件里的样子：<br /><br /><table style="WIDTH: 657px; HEIGHT: 922px" width="657" align="center" border="1"><tbody><tr><td class="main" bgcolor="#e6e6fa">＜!-- ORDER SERVICE --＞ <br />＜bean id="orderService"<br />　class="org.<br />　　　　 springframework.<br />　　　　 transaction.<br />　　　　 interceptor.<br />　　　　 TransactionProxyFactoryBean"＞<br />　＜property name="transactionManager"＞<br />　　＜ref local="myTransactionManager"/＞<br />　＜/property＞<br />　＜property name="target"＞<br />　　＜ref local="orderTarget"/＞<br />　＜/property＞<br />　＜property name="transactionAttributes"＞<br />　　＜props＞<br />　　　＜prop key="find*"＞<br />　　PROPAGATION_REQUIRED,readOnly,-OrderException<br />　　　＜/prop＞<br />　　　＜prop key="save*"＞<br />　　PROPAGATION_REQUIRED,-OrderException<br />　　 ＜/prop＞<br />　　＜/props＞<br />　＜/property＞<br />＜/bean＞<br />＜!-- ORDER TARGET PRIMARY BUSINESS OBJECT:<br />Hibernate implementation --＞<br />＜bean id="orderTarget"<br />　　　　 class="com.<br />　　　　　　　　meagle.<br />　　　　　　　　service.<br />　　　　　　　　spring.<br />　　　　　　　　OrderServiceSpringImpl"＞<br />　＜property name="orderDAO"＞<br />　　＜ref local="orderDAO"/＞<br />　＜/property＞<br />＜/bean＞<br />＜!-- ORDER DAO OBJECT --＞<br />＜bean id="orderDAO"<br />　　　　 class="com.<br />　　　　　　　　meagle.<br />　　　　　　　　service.<br />　　　　　　　　dao.<br />　　　　　　　　hibernate.<br />　　　　　　　　OrderHibernateDAO"＞<br />　＜property name="sessionFactory"＞<br />　　＜ref local="mySessionFactory"/＞<br />　＜/property＞<br />＜/bean＞ </td></tr></tbody></table><br />　　图4是我们已经连在一起的东西的一个概览。它展示了每个对象是怎样相关联的和怎样被Spring设置进其它对象中。把这幅图和示例应用中的Spring配置文件对比查看它们之间的关系。 <br /><br /><img height="352" alt="" src="http://dev.yesky.com/imagelist/06/24/zj7n69115h6l.gif" width="436" /><br />图4：这是Spring怎样将在这个配置的基础上装配beans。<br /><br />　　这个例子使用一个TransactionProxyFactoryBean，它有一个为我们已经定义了的事务管理者准备的setter方法。这是一个有用的对象，它知道怎样处理声明的事务操作和你的服务对象。你可以通过transactionAttributes属性定义事务怎样被处理，transactionAttributes属性为方法名定义模式和它们怎样参与进一个事务。<br /><br />　　TransactionProxyFactoryBean类也有一个为一个target准备的setter,target将是一个到我们的叫作orderTarget的业务服务对象的引用。 orderTarget bean定义使用哪个业务服务对象并有一个指向setOrderDAO()的属性。orderDAO bean将居于这个属性中，orderDAO bean是我们的和持久层交流的DAO对象。<br /><br />　　还有一个关于Spring和bean要注意的是bean能以两种模式工作。这两种模式被定义为singleton和prototype。一个bean默认的模式是singleton，意味着一个共享的bean的实例将被管理。这是用于无状态操作--像一个无状态会话bean将提供的那样。当bean由Spring提供时，prototype模式允许创建bean的新实例。你应当只有在每一个用户都需要他们自己的bean的拷贝时才使用prototype模式。<br /><img src ="http://www.blogjava.net/fengyun1801/aggbug/93173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengyun1801/" target="_blank">付翔</a> 2007-01-11 15:02 <a href="http://www.blogjava.net/fengyun1801/archive/2007/01/11/93173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>