??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
刚才偶然看到一?/span> msn, achqian@hotmail.com, 在技术列表中 . 估计是个?/span> java ?/span> . Q我很少乱加 MSN 好友Q?/span>
后来览他的博客才知?/span>
q个人就是发?/span>
webwork
?/span>
作者,很吃惊呀?/span>
ȝ看个人简介?/span> 82 q出生的?/span> 04 q?/span> 6 月就已经发布?/span> 最?/span> WebWork 教程 0.90 版?/span>
留下的只有吃惊和想不到。又一个技术牛人呀?/span>
我dƢ把一个h的成和q龄d比较。我更钦佩那些年龄不是很大,却非常具有开发实力的H击手?/span>
不说?/span> 向他们学习?/span>
Spring 框架是一个分层架构,?7 个定义良好的模块l成。Spring 模块构徏在核心容器之上,核心容器定义了创建、配|和理 bean 的方式,如图 1 所C?/p>
?1. Spring 框架?7 个模?/b>
| Spring 面向斚w~程QAOPQ和控制反{ QIOCQ?容器
l成 Spring 框架的每个模块(或组Ӟ都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下Q?
BeanFactory
Q它是工厂模式的实现?font color="#0000ff">BeanFactory
使用控制反{ QIOCQ?模式应用程序的配置和依赖性规范与实际的应用程序代码分开?
Spring 框架的功能可以用在Q?J2EE 服务器中Q大多数功能也适用于不受管理的环境。Spring 的核心要ҎQ支持不l定到特?J2EE 服务的可重用业务和数据访问对象。毫无疑问,q样的对象可以在不同 J2EE 环境 QWeb ?EJBQ、独立应用程序、测试环境之间重用?
代碼:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/TestDB</value> </property> <property name="username"> <value>caterpillar</value> </property> <property name="password"> <value>123456</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean" destroy-method="close"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="mappingResources"> <list> <value>User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> net.sf.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql"> true </prop> </props> </property> </bean> <bean id="userDAO" class="onlyfun.caterpillar.UserDAO"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> </beans>
在這邊UserDAO繼承自HibernateDaoSupport別Q這可以幫我們省M些管理sessionFactory、hibernateTemplate資源的工作,我們只要注入sessionFactory好了,我們的DAOa計如下Q?
代碼:
package onlyfun.caterpillar; import net.sf.hibernate.*; import org.springframework.orm.hibernate.*; import org.springframework.orm.hibernate.support.*; public class UserDAO extends HibernateDaoSupport { public void insertUser(final User user) { getHibernateTemplate().execute(new HibernateCallback() { publicObject doInHibernate(Session session) throws HibernateException { session.saveOrUpdate(user); returnnull; } }); } }
只要注入sessionFactoryQ之後調用getHibernateTemplate()可以取得HibernateTemplate的實例,我們利用callbackҎQ實作HibernateCallback介面Q在doInHibernate()中進行存儲操作?
於單的存儲操作,我們甚臛_以直接用HibernateTemplate所提供的find()、load()、saveOrUpdate()、delete(){方法,而不用用callbackQ例如:
代碼:
package onlyfun.caterpillar; import org.springframework.orm.hibernate.support.*; public class UserDAO extends HibernateDaoSupport { public void insertUser(User user) { getHibernateTemplate().saveOrUpdate(user); } }
不用LQ程式就是如此簡單,所有的細節都被裝起來了?
HibernateTemplate中只能丟出unckecked例外Q如果需要處理checked例外Q則您可以用AOP Interceptor來取代HibernateTemplateQ從而取代callbackҎQ在參考手冊中有介紹如何配|,這邊複製過來以便參考:
代碼:
.... <bean id="myHibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor"> <property name="sessionFactory"> <ref bean="mySessionFactory"/> </property> </bean> <bean id="myProductDaoTarget" class="product.ProductDaoImpl"> <property name="sessionFactory"> <ref bean="mySessionFactory"/> </property> </bean> <bean id="myProductDao" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>product.ProductDao</value> </property> <property name="interceptorNames"> <list> <value>myHibernateInterceptor</value> <value>myProductDaoTarget</value> </list> </property> </bean> ....
代碼:
public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao { public List loadProductsByCategory(finalString category) throws MyException { Session session = SessionFactoryUtils.getSession(getSessionFactory(), false); try { List result = session.find( "from test.Product product where product.category=?", category, Hibernate.STRING); if (result == null) { thrownew MyException("invalid search result"); } return result; } catch (HibernateException ex) { throw SessionFactoryUtils.convertHibernateAccessException(ex); } } }