Spring+Hibernate+Struts2整合[整体思路][1/6]

Spring+Hibernate+Struts2整合,分成了6个章节分开讲解,本章节主要讲解了大体思路,入门篇!


 

  • Hibernate:
  1. hibernate.cfg.xml配置sessionFactroy以及其他信息。
  2. POJO.hbm.xml配置对象关系映射信息。
  3. 实体类POJO。
  • Struts2:
  1. struts.xml配置视图以及action信息。
  2. 在Spring可以使用注解方式,则无需xml文件配置。
  3. Jar包:整合Jar包、(如需注解,还有注解Jar包,其他整合选用其他Jar包)。[struts2-spring-plugin-2.3.34.jar][struts2-convention-plugin-2.3.34.jar]
  • Spring:
  1. Ioc/DI(action层、service层、dao层以及其他需要管理的类)主要用于管理Bean对象以及依赖注入。
  2. AOP(主要声明式事务管理):事务的开启、提交、回滚、关闭等操作与业务解耦,由Spring统一管理,运用的是AOP技术

有了以上的简单思想后,开始整合设计:

配置方式大致分为2类:

    1. 一类是xml配置
    2. 一类是注解配置

 不论哪一种,先从数据源dataSource和session工厂的配置下手:

  • 数据源dataSource:

数据源交给Spring管理:数据源有很多选择,比如常见的c3p0、dbcp等;

以c3p0为例:

 1     <!-- 配置数据源[以读取外部属性文件的形式] -->
 2     <context:property-placeholder
 3         location="classpath:jdbc.properties" />
 4     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
 5         <property name="driverClass" value="${driverClass}"></property>
 6         <property name="jdbcUrl" value="${jdbcUrl}"></property>
 7         <property name="user" value="${user}"></property>
 8         <property name="password" value="${password}"></property>
 9         <property name="initialPoolSize" value="${initialPoolSize}"></property>
10         <property name="minPoolSize" value="${minPoolSize}"></property>
11         <property name="maxPoolSize" value="${maxPoolSize}"></property>
12     </bean>

jdbc.properties

driverClass=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/zhangpn?serverTimezone\=GMT&useSSL\=false
user=root
password=zhangpn
initialPoolSize=5
minPoolSize=5
maxPoolSize=10

 

使用properties文件易于管理(推荐使用);

  • 会话工厂sessionFactory:

sessionFactory交给Spring管理:在sessionFactory中配置POJO类是以xml方式配置还是注解配置

    <!-- 配置session工厂 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <!-- 需要去了解学习 -->
                <prop key="javax.persistence.validation.mode">none</prop>
                <!-- Session绑定线程 -->
                <prop key="hibernate.cunrrent_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</prop>
            </props>
        </property>

          <property name="packagesToScan">
              <array>
                  <value>com.zhangpn.entity</value>
              </array>
          </property>
    </bean>

 

以上是通过注解的方式配置的,主要是<property name="packagesToScan">扫描指定包是否有注解;

  <!-- ======================== Introduction ============================== -->
  <!--                            映射配置文件方式                             -->
  <!--                                                                      -->
  <!--
        <property name="mappingLocations">
            <value>classpath:/com/zhangpn/entity/Book.hbm.xml</value>
        </property>

 

以上一小段是通过配置文件配置的;[殊途同归,看应用场景而选择] 

  • 声明式事务管理:

首先,声明事务管理员,相当于AOP技术中Aspect的意思,封装了对事务的开启等各种操作方法,让你用于嵌入你的方法,省去了你在业务中耦合事务操作的代码;

    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

 

2种配置方式:

    • xml配置
    <tx:advice id="txAdvice"
        transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"
                isolation="READ_COMMITTED" />
            <tx:method name="create*" propagation="REQUIRED"
                isolation="READ_COMMITTED" />
            <tx:method name="update*" propagation="REQUIRED"
                isolation="READ_COMMITTED" />
            <tx:method name="delete*" propagation="REQUIRED"
                isolation="READ_COMMITTED" />
            <tx:method name="query*" propagation="SUPPORTS"
                read-only="true" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut
            expression="execution(* com.zhangpn.serviceImpl.*.*(..))"
            id="txMethod" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txMethod" />
    </aop:config>

 

    • 注解配置
<tx:annotation-driven transaction-manager="transactionManager"/>

 

在业务service层中:(示例代码)

@Service("customerService")
@Transactional(readOnly=true,propagation=Propagation.SUPPORTS)
public class CustomerServiceImpl implements ICustomerService {
    @Resource(name="customerDao")
    private ICustomerDao customerDao;

    @Override
    public List<Customer> findAllCustomer(DetachedCriteria dCriteria) {
        return customerDao.findAll(dCriteria);
    }

    @Override
    @Transactional(readOnly=false,propagation=Propagation.REQUIRED)
    public void saveCustomer(Customer customer) {
        customerDao.save(customer);
    }

}

 


其实,配置完以上的内容,已经完成了与hibernate整合的大部分内容了。

接下来,开始进行web.xml的配置,以及对action、service、dao层的具体配置。请看下一章节

 

posted @ 2018-06-15 09:50  呦,可以呦  阅读(197)  评论(0)    收藏  举报