下面是HibernateSessionFactory 和  HibernateTransactionManager:的配置: <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>标签引用。在这里,mySessionFactory引用了HibernateSessionFactory,而myTransactionManager引用了HibernateTransactionManage。  注意代码中myTransactionManger Bean有个sessionFactory属性。  HibernateTransactionManager有个sessionFactory setter 和 getter方法,这是用来在Spring启动的时候实现“依赖注入” (dependency injection)的。  在sessionFactory 属性里 引用mySessionFactory。这两个对象在Spring容器初始化后就被组装了起来了。 这样的搭配让你从 单例(singleton objects)和工厂(factories)中解放了出来,降低了代码的维护代价。 mySessionFactory.的两个属性,分别是用来注入mappingResources 和 hibernatePropertes的。通常,如果你在Spring之外使用Hibernate,这样的设置应该放在hibernate.cfg.xml中的。 不管怎样,Spring提供了一个便捷的方式-----在Spring内部配置中并入了Hibernate的配置。 如果要得到更多的信息,可以查阅Spring API。 
  
  
既然我们已经组装配置好了Service Beans,就需要把Business Service Object和 DAO也组装起来,并把这些对象配到一个事务管理器(transaction manager)里。 
  
在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注入到其他对象。把它与Spring的配置文件比较,观察他们之间的关系 
  
  图 4. Spring就是这样基于配置文件,将各个Bean搭建在一起。 
  
这个例子使用一个TransactionProxyFactoryBean,它定义了一个setTransactionManager()。 这对象很有用,他能很方便的处理你申明的事物还有Service Object。    你可以通过transactionAttributes属性来定义怎样处理。 想知道更多还是参考TransactionAttributeEditor吧。 
TransactionProxyFactoryBean 还有个setter. 这会被我们 Business service object(orderTarget)引用, orderTarget定义了 业务服务层,并且它还有个属性,由setOrderDAO()引用。这个属性 
  
Spring 和Bean 的还有一点要注意的: bean可以以用两种方式创造。 这些都在单例模式(Sington)和原型模式(propotype)中定义了。  默认的方式是singleton,这意味着共享的实例将被束缚。 而原形模式是在Spring用到bean的时候允许新建实例的。当每个用户需要得到他们自己Bean的Copy时,你应该仅使用prototype模式。(更多的请参考设计模式中的单例模式和原形模式)  
 
  |