(AppFuse中)Spring的配置及事务配置

(一)
Appfuse简介
Appfuse是Matt Raible 开发的一个指导性的 入门级J2EE框架它对如何集成流行的Spring、Hibernate、ibatis、struts、Xdcolet、junit 等基础框架给出了示范,新的1.7版更是提供了对Taperstry和JSF的支持。
在持久层,AppFuse采用了Hibernate O/R映射工具( http://www.hibernate.org);
在容器方面,它采用了Spring Framework( http://www.springframework.org)。
web框架方面:用户可以自由选择 Struts、Spring/MVC, Webwork,Taperstry、 JSF这几个。
采用TDD的开发方式,使用JUnit测试各层,甚至测试 jsp 输出的w/o 错误。
为了简化开发,预定义好了一套目录结构、基类、用来创建数据库、配置Tomcat、测试部署应用的 Ant 任务,帮助快速自动生成源程序和自动维护部分配置文件。
 
(二)
1.
Spring中,BeanFactory提供了一种先进的配置机制来管理任何种类bean(对象),
ApplicationContext是BeanFactory的完全超集,我们大部分时间面对的是ApplicationContext,通过它取得 bean,处理bean,而其他的事务管理、远程访问等则交由Spring容器去管理好了。
2.
ApplicationContext可以通过编码加载并实例化,对于web应用,Spring提供了可配置的
ApplicationContext加载机制。
加载器目前有两种选择:
1 : ContextLoaderListener  (基于Servlet2.3版本中新引入的Listener接口实现)
2 : ContextLoaderServlet   (基于Servlet接口实现)
这两者在功能上完全相同
 
(三)
AppFuse中的Spring配置
(1)
指定ApplicationContext配置文件的位置,该参数不是必须的如果不指定该参数,web容器会自动加
载 WEB-INF/applicationContext.xml, 并实例化ApplicationContext.
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
(2)
AppFuse中的ApplicationContext加载是通过ContextLoaderListener配置实现的.
Web容器启动时,通过ContextLoaderListener,会调用Spring的contextInitialized事件初始化
Spring的ApplicationContext。
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-
class>
  </listener>
(3)
初始化完ApplicationContext后,就可以通过以下方式引用ApplicationContext来管理beans了:
ApplicationContext ctx  =    
WebApplicationContextUtils.getRequiredWebApplicationContext(context);
(4)
Spring事务管理两种:
1.
Spring即提供了对于JDBC,Hibernate Trasaction等依赖特定事务资源的事务处理
2.
提供了依赖容器的参数化事务支持(即:又Spring容器管理事务).
(5)
Spring事务管理配置

1.
使用Hibernate提供的OpenSessionInView技术,即在视图层开启和关闭 Session,在service层进行
Transaction管理,这个较为简单,只需要设置一个filter即可,在web.xml中配置
  <filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-
class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
2.
配置数据源,这里采用Jndi访问方式。
< bean id = " dataSource " class = "  org.springframework.jndi.JndiObjectFactoryBean " >
       < property name = " jndiName " > 
           < value > java:comp / env / jdbc / dudu </ value > 
      </ property > 
</ bean >  
3.
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
       <property name="dataSource">
           <ref bean="dataSource" />
       </property>
       <property name="mappingResources">
           <list>
              <value>mf/org/user/User.hbm.xml</value>
           </list>
       </property>
</bean>
/*
这一个 bean 让 spring 为我们注入了什么呢?事务,对!我们把 hibernate 的事务注入到了 spring 的 IOC 容器之中了。
*/
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
       <property name="sessionFactory">
           <ref local="sessionFactory" />
       </property>
</bean>
/*
这个 bean 又是让 spring 为我们注入了了什么呢?事务代理,对了!我们把事务的代理交给一个 txProxyTemplate 的去做了.
这里就是事务处理时如果遇到异常信息,或者其他的原因时我们要求 spring 把当前的事务回滚了,这样才能不至于在数据库中产生垃圾啊。我们规定所有的 save,remove,update,incress 这样的方法开头的在出现一些问题后把事务给回滚了,看看我们写的:  PROPAGATION_REQUIRED,-Exception 。
当然我们在处理一个事务时只要有一个 PROPAGATION_REQUIRED 就可以了;
开启两个事务时如果有一个抛出异常了,我们就要把上一个提交的事务回滚了,这样做我们就要用的 -Exception 了.
*/
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
       <property name="transactionManager">
           <ref bean="transactionManager" />
       </property>
       <property name="transactionAttributes">
           <props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="incress*">PROPAGATION_REQUIRED,-Exception </prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
           </props>
       </property>
    </bean>

<bean id="userManager" parent="txProxyTemplate">
       <property name="target" ref="userManagerTarget" />
</bean>
<bean id="userManagerTarget" class=" mf.org.hb.user.service.impl.UserManagerImpl">
       <property name="userDAO" ref="userDAO" />
</bean>
<bean id="userDAO" class="mf.org.hb.user.dao.hibernate.UserDAOHibernate">
       <property name="sessionFactory" ref="sessionFactory" />
</bean>
(6)
数据访问形式:
public   class  UserDAOHibernate  extends  BaseDAOHibernate  implements  UserDAO 
{
        public   void  saveUser( final  User user)  {
        getHibernateTemplate().saveOrUpdate(user);
        getHibernateTemplate().flush();
       } 
}  
(7)
以下是一些AppFuse中实现的,辅助的Spring监听器和过滤器
7.1
保证Spring所管理的JavaBeans能被正常的初始化和销毁,这个监听器不是 Spring框架必须的。
WEB-INF/web.xml
< listener > 
     < listener - class > 
        org.springframework.web.util.IntrospectorCleanupListener
     </ listener - class > 
</ listener >  
7.2
解决Web应用中POST的中文乱码问题,为用户请求定义字符编码,这是因为当前的浏览器一般都不设
置字符编码,即便是你在Html文件获Form中设置了字符编码
WEB-INF/web.xml
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
7.3
一般的web容器加载Spring的ApplicationContext配置如下:
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-
class>
  </listener>

< servlet > 
         < servlet - name > context </ servlet - name > 
         < servlet - class > 
            org.springframework.web.context. ContextLoaderServlet
         </ servlet - class > 
         < load - on - startup > 1 </ load - on - startup > 
</ servlet >

你可能感兴趣的:(spring,职场,Appfuse,休闲)