• Spring-3


    主要学习内容:

      Spring的事务管理

      三大框架整合

    上次内容回顾 Spring-1Spring-2:

    Spring的AOP开发:

    * AOP:面向切面编程,是对OO思想延伸.

    * AOP底层实现原理:动态代理.

    * JDK动态代理:针对实现了接口的类生产代理.

    * CGLIB代理:针对没有实现接口的类,产生一个子类.

    * AOP术语:

    * JoinPoint:可以被拦截点.

    * Ponitcut:真正被拦截.

    * Advice:通知,增强的代码.

    * 引介:特殊通知,类级别上添加属性或方法.

    * Target:目标对象.

    * Proxy:代理对象.

    * Weaving:

    * Aspect:

    * Spring的AOP的开发:

    * 配置applicationContext.xml生成代理对象.

    * 使用ProxyFactoryBean类生产代理:

    * 根据目标对象是否实现了接口,选择使用JDK还是CGLIB.

    * 缺点:需要为每个类都去配置一个ProxyFactoryBean.

    * 采用Spring自动代理:

    * 基于类名称的自动代理:(采用后处理Bean)

    * 基于切面信息的自动代理:(采用后处理Bean)

    * Spring的AspectJ的切面开发.

    * AspectJ:本身第三方切面框架.

    * AspectJ基于注解开发:

    * 定义切面:

    @Aspect

    * 定义增强:

    @Before:前置通知.

    @AfterReturing:后置通知.

    @Around:环绕通知.

    @AfterThrowing:异常抛出通知.

    @After:最终通知.

    * 定义切点:

    @Pointcut

    * AspectJ基于XML开发:

    * 引入aop名称空间.

    <aop:config>

    <aop:pointcut expression=”” id=””/>

    <aop:aspect ref=””>

    <aop:before...>

    </aop:aspect>

    </aop:config>

    Spring的JDBCTemplate:

    * 配置连接池:

    * 默认

    * DBCP

    * C3P0(*****)

    * 引入外部属性文件.

    * 在DAO中注入JdbcTemplate.

    * 在DAO中不直接注入模板.Dao集成JdbcDaoSupport.

    * CRUD的操作.


    1.1   Spring的事务管理:

    1.1.1   事务:

    事务:是逻辑上一组操作,要么全都成功,要么全都失败.

    事务特性:

    ACID:

    原子性:事务不可分割

    一致性:事务执行的前后,数据完整性保持一致.

    隔离性:一个事务执行的时候,不应该受到其他事务的打扰

    持久性:一旦结束,数据就永久的保存到数据库.

    如果不考虑隔离性:

    脏读:一个事务读到另一个事务未提交数据

    不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事务多次查询结果不一致

    虚读:一个事务读到另一个事务已经提交数据(insert)导致一个事务多次查询结果不一致

    事务的隔离级别:

    未提交读:以上情况都有可能发生。

    已提交读:避免脏读,但不可重复读,虚读是有可能发生。

    可重复读:避免脏读,不可重复读,但是虚读有可能发生。

    串行的:避免以上所有情况.

    1.1.2   Spring中事务管理:

    分层开发:事务处在Service层.

    Spring提供事务管理API:

    PlatformTransactionManager:平台事务管理器.

    commit(TransactionStatus status)

    getTransaction(TransactionDefinition definition)

    rollback(TransactionStatus status)

    TransactionDefinition:事务定义

    ISOLation_XXX:事务隔离级别.

    PROPAGATION_XXX:事务的传播行为.(不是JDBC中有的,为了解决实际开发问题.)

    过期时间:

    TransactionStatus:事务状态

    是否有保存点

    是否一个新的事务

    事务是否已经提交

    关系:PlatformTransactionManager通过TransactionDefinition设置事务相关信息管理事务,管理事务过程中,产生一些事务状态:状态由TransactionStatus记录.

    API详解:

    PlatformTransactionManager:接口.

    Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现

    org.springframework.jdbc.datasource.DataSourceTransactionManager   :    使用SpringJDBCiBatis 进行持久化数据时使用

    org.springframework.orm.hibernate3.HibernateTransactionManager     :     使用Hibernate3.0版本进行持久化数据时使用

    org.springframework.orm.jpa.JpaTransactionManager  使用JPA进行持久化时使用

    org.springframework.jdo.JdoTransactionManager  当持久化机制是Jdo时使用

    org.springframework.transaction.jta.JtaTransactionManager  使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

    TransactionDefinition:

    * ISOLATION_DEFAULT:默认级别. Mysql  repeatable_read        oracle read_commited

    ISOLATION_READ_UNCOMMITTED

    ISOLATION_READ_COMMITTED

    ISOLATION_REPEATABLE_READ

    ISOLATION_SERIALIZABLE

    * 事务的传播行为:(不是JDBC事务管理,用来解决实际开发的问题.)传播行为:解决业务层之间的调用的事务的关系.

    PROPAGATION_REQUIRED     :支持当前事务,如果不存在就新建一个

    * A,B   如果A有事务,B使用A的事务,如果A没有事务,B就开启一个新的事务.(A,B是在一个事务中。)

    PROPAGATION_SUPPORTS     :支持当前事务,如果不存在,就不使用事务

    * A,B   如果A有事务,B使用A的事务,如果A没有事务,B就不使用事务.

    PROPAGATION_MANDATORY   :支持当前事务,如果不存在,抛出异常

    * A,B   如果A有事务,B使用A的事务,如果A没有事务,抛出异常.

    PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务

    * A,B   如果A有事务,B将A的事务挂起,重新创建一个新的事务.(A,B不在一个事务中.事务互不影响.)

    PROPAGATION_NOT_SUPPORTED   以非事务方式运行,如果有事务存在,挂起当前事务

    * A,B   非事务的方式运行,A有事务,就会挂起当前的事务.

    PROPAGATION_NEVER   以非事务方式运行,如果有事务存在,抛出异常

    PROPAGATION_NESTED  如果当前事务存在,则嵌套事务执行

    * 基于SavePoint技术.

    * A,B   A有事务,A执行之后,将A事务执行之后的内容保存到SavePoint.B事务有异常的话,用户需要自己设置事务提交还是回滚.

    * 常用:(重点)

    PROPAGATION_REQUIRED

    PROPAGATION_REQUIRES_NEW

    PROPAGATION_NESTED


    1.1.3   Spring的事务管理:

    Spring的事务管理分成两类:

    * 编程式事务管理:

    * 手动编写代码完成事务管理.

    * 声明式事务管理:

    * 不需要手动编写代码,配置.


    1.1.4   事务操作的环境搭建:

    CREATE TABLE `account`(

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `name` varchar(20) NOT NULL,

      `money` double DEFAULT NULL,

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDBAUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

    INSERT INTO `account`VALUES ('1', 'aaa', '1000');

    INSERT INTO `account`VALUES ('2', 'bbb', '1000');

    INSERT INTO `account`VALUES ('3', 'ccc', '1000');

    创建一个web项目:

    * 导入相应jar包

    * 引入配置文件:

    * applicationContext.xml、log4j.properties、jdbc.properties

    创建类:

    * AccountService

    * AccountDao

    在Spring中注册:

    <!-- 业务层类 -->

    <beanid="accountService" class="cn.itcast.spring3.demo1.AccountServiceImpl">

        <!-- 在业务层注入Dao -->

        <property name="accountDao"ref="accountDao"/>

    </bean>

    <!-- 持久层类 -->

    <beanid="accountDao"class="cn.itcast.spring3.demo1.AccountDaoImpl">

        <!-- 注入连接池的对象,通过连接池对象创建模板.-->

        <propertyname="dataSource" ref="dataSource"/>

    </bean>

    编写一个测试类:


    1.1.5   Spring的事务管理:

    手动编码的方式完成事务管理:

    需要事务管理器:真正管理事务对象.

    * Spring提供了事务管理的模板(工具类.)

     

    第一步:注册事务管理器:

    <!-- 配置事务管理器 -->

    <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <!-- 需要注入连接池,通过连接池获得连接 -->

        <property name="dataSource"ref="dataSource"/>

    </bean>

    第二步:注册事务模板类:

    <!-- 事务管理的模板 -->

    <beanid="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate">

        <property name="transactionManager" ref="transactionManager"/>

    </bean>

    第三步:在业务层注入模板类:(模板类管理事务)

    <!-- 业务层类 -->

    <beanid="accountService"class="cn.itcast.spring3.demo1.AccountServiceImpl">

        <!-- 在业务层注入Dao -->

        <property name="accountDao"ref="accountDao"/>

        <!-- 在业务层注入事务的管理模板 -->

        <property name="transactionTemplate"ref="transactionTemplate"/>

    </bean>

    第四步:在业务层代码上使用模板:

    public void transfer(finalString from, final String to, final Double money) {

        transactionTemplate.execute(newTransactionCallbackWithoutResult() {

            @Override

            protectedvoid doInTransactionWithoutResult(TransactionStatus status) {

                accountDao.out(from,money);

                int d = 1 / 0;

                accountDao.in(to, money);

            }

        });

    }

    手动编码方式缺点:

    * 代码量增加,代码有侵入性.


    声明式事务管理:(原始方式)

    基于TransactionProxyFactoryBean.

    导入:aop相应jar包.

    第一步:注册平台事务管理器:

    <!-- 事务管理器 -->

    <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <!-- 注入连接池 -->

        <property name="dataSource"ref="dataSource"/>

    </bean>

    第二步:创建业务层代理对象:

    <!-- 配置生成代理对象 -->

    <bean id="accountServiceProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

        <!-- 目标对象-->

        <property name="target"ref="accountService"/>

        <!-- 注入事务管理器-->

        <propertyname="transactionManager" ref="transactionManager"/>

        <!-- 事务的属性设置-->

        <propertyname="transactionAttributes">

            <props>

                <propkey="transfer">PROPAGATION_REQUIRED</prop>

            </props>

        </property>

    </bean>

    第三步:编写测试类:

    ***** 千万注意:注入代理对象

    @Autowired

    @Qualifier("accountServiceProxy")

    private AccountService accountService;

    prop格式:PROPAGATION,ISOLATION,readOnly,-Exception,+Exception

    * 顺序:传播行为、隔离级别、事务是否只读、发生哪些异常可以回滚事务(所有的异常都回滚)、发生了哪些异常不回滚.

     

    *****缺点:就是需要为每一个管理事务的类生成代理.需要为每个类都需要进行配置.

    声明式事务管理:(自动代理.基于切面 ******)

    第一步:导入相应jar.

    * aspectj

     

    第二步:引入相应约束:

    * aoptx约束.

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context.xsd

    http://www.springframework.org/schema/aop

    http://www.springframework.org/schema/aop/spring-aop.xsd

    http://www.springframework.org/schema/tx

    http://www.springframework.org/schema/tx/spring-tx.xsd">

     

    第三步:注册事务管理器;

    <!-- 事务管理器 -->

    <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource"ref="dataSource"/>

    </bean>

    第四步:定义增强(事务管理)

    <!-- 定义一个增强 -->

    <tx:advice id="txAdvice"transaction-manager="transactionManager">

        <!-- 增强(事务)的属性的配置 -->

        <tx:attributes>

            <!--

                isolation:DEFAULT  :事务的隔离级别.

                propagation         :事务的传播行为.

                read-only           :false.不是只读

                timeout             :-1

                no-rollback-for     :发生哪些异常不回滚

                rollback-for        :发生哪些异常回滚事务

             -->

            <tx:methodname="transfer"/>

        </tx:attributes>

    </tx:advice>

     

    第五步:定义aop的配置(切点和通知的组合)

    <!-- aop配置定义切面和切点的信息 -->

    <aop:config>

        <!-- 定义切点:哪些类的哪些方法应用增强 -->

        <aop:pointcut expression="execution(*cn.itcast.spring3.demo3.AccountService+.*(..))" id="mypointcut"/>

        <!-- 定义切面:-->

        <aop:advisor advice-ref="txAdvice"pointcut-ref="mypointcut"/>

    </aop:config>

    第六步:编写测试类:

    * 注入Service对象,不需要注入代理对象(生成这个类的时候,已经是代理对象.)

    基于注解的事务管理:

    第一步:事务管理器:

    <!-- 事务管理器 -->

    <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <propertyname="dataSource" ref="dataSource"/>

    </bean>

    第二步:注解事务:

    <!-- 开启注解的事务管理 -->

    <tx:annotation-driventransaction-manager="transactionManager"/>

    第三步:在Service上使用注解

    @Transactional

    * 注解中有属性值:

    * isolation

    * propagation

    * readOnly

    ...

    1.2   SSH框架整合:

    1.2.1   Struts2+Spring+Hibernate导包

    Struts2导入jar包:

    * struts2/apps/struts2-blank.war/WEB-INF/lib/*.jar

    * 导入与spring整合的jar

    * struts2/lib/struts2-spring-plugin-2.3.15.3.jar       --- 整合Spring框架

    * struts2/lib/struts2-json-plugin-2.3.15.3.jar         --- 整合AJAX

    *struts2/lib/struts2-convention-plugin-2.3.15.3.jar   --- 使用Struts2注解开发.

     

    * 配置

    web.xml

    <filter>

      <filter-name>struts2</filter-name>

     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

    </filter>

    <filter-mapping>

      <filter-name>struts2</filter-name>

      <url-pattern>/*</url-pattern>

    </filter-mapping>

    struts.xml

    <struts>

        <constantname="struts.devMode" value="true" />

        <packagename="default" namespace="/"extends="struts-default">

       

        </package>

    </struts>

     

     

    Spring导入jar:

    Spring3.2 开发最基本jar

    spring-beans-3.2.0.RELEASE.jar

    spring-context-3.2.0.RELEASE.jar

    spring-core-3.2.0.RELEASE.jar

    spring-expression-3.2.0.RELEASE.jar

    com.springsource.org.apache.commons.logging-1.1.1.jar

    com.springsource.org.apache.log4j-1.2.15.jar

    AOP开发

    spring-aop-3.2.0.RELEASE.jar

    spring-aspects-3.2.0.RELEASE.jar

    com.springsource.org.aopalliance-1.0.0.jar

    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

    Spring Jdbc开发

    spring-jdbc-3.2.0.RELEASE.jar

    spring-tx-3.2.0.RELEASE.jar

    Spring事务管理

    spring-tx-3.2.0.RELEASE.jar

    Spring整合其他ORM框架

    spring-orm-3.2.0.RELEASE.jar

    Spring在web中使用

    spring-web-3.2.0.RELEASE.jar

    Spring整合Junit测试

    spring-test-3.2.0.RELEASE.jar

    (Spring没有引入c3p0和数据库驱动)

    * 配置:

    applicationContext.xml

    Log4j.properties

    在web.xml中配置监听器;

    <!-- 配置Spring的监听器 -->

    <listener>

    <!-- 监听器默认加载的是WEB-INF/applicationContext.xml-->

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <!-- 指定Spring框架的配置文件所在的位置 -->

    <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>classpath:applicationContext.xml</param-value>

    </context-param>

    Hibernate的jar包导入:

    * 核心包:hibernate3.jar

    * lib/required/*.jar

    * lib/jpa/*.jar

    * 引入hibernate整合日志系统的jar包:

    * 数据连接池:

    * 数据库驱动:

    * 二级缓存:(可选的.)

    * backport-util-concurrent.jar

    * commons-logging.jar

    * ehcache-1.5.0.jar

    * Hibernate的配置:

    * hibernate.cfg.xml

    * 映射:

    * 格式:类名.hbm.xml


    1.2.2   Struts2和Spring的整合:

    1.新建包结构:

    * cn.itcast.action

    * cn.itcast.service

    * cn.itcast.dao

    * cn.itcast.vo

    2.创建实体类:

    * Book

    3.新建一个jsp页面:

    * addBook.jsp

            <s:form action="book_add"namespace="/" method="post" theme="simple">

    图书名称:<s:textfield name="name"/><br/>

    图书价格:<s:textfield name="price"/><br/>

    <s:submit value="添加图书"/>

    </s:form>

    4.编写Action:

    public class BookAction extends ActionSupport implementsModelDriven<Book>{

    // 模型驱动类

    private Book book = newBook();

    public Book getModel() {

        return book;

    }

    // 处理请求的方法:

    public String add(){

        System.out.println("web层的添加执行了...");

        return NONE;

    }

    }

    5.配置struts.xml

    <action name="book_*"class="cn.itcast.action.BookAction" method="{1}">

           

        </action>

    1.2.3   Struts2和Spring的整合两种方式:

    Struts2自己管理Action:(方式一)

    <actionname="book_*" class="cn.itcast.action.BookAction"method="{1}">

    * Struts2框架自动创建Action的类.

    Action交给Spring管理:(方式二)

    可以在<action>标签上通过一个伪类名方式进行配置:

    <actionname="book_*" class="bookAction"method="{1}"></action>

    在spring的配置文件中:

    <!-- 配置Action -->

    <bean id="bookAction"class="cn.itcast.action.BookAction"></bean>

    (*****)注意:Action交给Spring管理一定要配置scope=”prototype

    推荐使用二:

    * 在Spring中管理的类,可以对其进行AOP开发.统一的管理.

    Web层获得Service:

    传统方式:

    * 获得WebApplicationContext对象.

    * 通过WebAppolicationContext中getBean(“”);

    实际开发中:

    * 引入了struts2-spring-plugin-2.3.15.3.jar

    * 有一个配置文件 :struts-plugin.xml

    开启常量 :

    <constant name="struts.objectFactory"value="spring" />

    引发另一个常量的执行:(Spring的工厂类按照名称自动注入)

    struts.objectFactory.spring.autoWire = name

    1.2.4   Spring整合Hibernate:

    Spring整合Hibernate框架的时候有两种方式:

    零障碍整合:(一)

    可以在Spring中引入Hibernate的配置文件.

    1.通过LocalSessionFactoryBean在spring中直接引用hibernate配置文件

    <!-- 零障碍整合 在spring配置文件中引入hibernate的配置文件 -->

    <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

        <propertyname="configLocation"value="classpath:hibernate.cfg.xml"/>

    </bean>

    2.Spring提供了Hibernate的模板.只需要将HibernateTemplate模板注入给DAO.

    * DAO继承HibernateDaoSupport.

    <!-- DAO的配置-->

    <bean id="bookDao"class="cn.itcast.dao.BookDao">

        <propertyname="sessionFactory" ref="sessionFactory"/>

    </bean>

    改写DAO:继承HibernateDaoSupport类.

    public class BookDao extends HibernateDaoSupport{

    public void save(Book book) {

        System.out.println("DAO层的保存图书...");

        this.getHibernateTemplate().save(book);

    }

    }

    3.创建一个映射文件 :

    <hibernate-mapping>

    <classname="cn.itcast.vo.Book" table="book">

        <id name="id">

            <generatorclass="native"/>

        </id>

        <property name="name"/>

        <property name="price"/>

    </class>

    </hibernate-mapping>

    4.别忘记事务管理:

    事务管理器:

    <!-- 管理事务 -->

    <beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory" ref="sessionFactory"/>

    </bean>

    5.注解管理事务:

    <!-- 注解开启事务 -->

    <tx:annotation-driventransaction-manager="transactionManager"/>

    6.在业务层类上添加一个注解:

    @Transactional


    没有Hibernate配置文件的形式(二)

    不需要Hibernate配置文件的方式,将Hibernate配置文件的信息直接配置到Spring中.

    Hibernate配置文件中的信息 :

    * 连接数据库基本参数:

    * Hibernate常用属性:

    * 连接池:

    * 映射:

    把Hibernate配置文件整合Spring中:

    连接池:

    <!-- 引入外部属性文件. -->

    <context:property-placeholderlocation="classpath:jdbc.properties"/>

    <!-- 配置c3p0连接池 -->

    <bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">

        <propertyname="driverClass" value="${jdbc.driver}"/>

        <propertyname="jdbcUrl" value="${jdbc.url}"/>

        <propertyname="user" value="${jdbc.user}"/>

        <propertyname="password" value="${jdbc.password}"/>

    </bean>


    Hibernate常用属性:

    <!-- 配置Hibernate的属性 -->

        <property name="hibernateProperties">

            <props>

                <propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

                <propkey="hibernate.show_sql">true</prop>

                <propkey="hibernate.format_sql">true</prop>

                <propkey="hibernate.hbm2ddl.auto">update</prop>

                <propkey="hibernate.connection.autocommit">false</prop>

            </props>

        </property>

    映射

    <!-- <propertyname="mappingResources">

            <list>

                <value>cn/itcast/vo/Book.hbm.xml</value>

            </list>

        </property> -->

        <propertyname="mappingDirectoryLocations">

            <list>

                <value>classpath:cn/itcast/vo</value>

            </list>

        </property>


    1.2.5   HibernateTemplate的API:

     Serializable save(Object entity)                      :保存数据

     void update(Object entity)                        :修改数据

     void delete(Object entity)                        :删除数据

     <T> T get(Class<T> entityClass,Serializable id)      :根据ID进行检索.立即检索

     <T> T load(Class<T> entityClass,Serializable id)     :根据ID进行检索.延迟检索.

     List find(String queryString, Object...values)       :支持HQL查询.直接返回List集合.

     List findByCriteria(DetachedCriteriacriteria)        :离线条件查询.

     List findByNamedQuery(String queryName,Object... values) :命名查询的方式.

     

    1.2.6   OpenSessionInView:


    1.3   基于注解的方式整合SSH:

    导入以上工程jar包:

    * 导入struts2的注解开发:

    * struts2-convention-plugin-2.3.15.3.jar

    * web.xml:

    <!-- 配置Spring的监听器 -->

    <listener>

    <!-- 监听器默认加载的是WEB-INF/applicationContext.xml-->

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <!-- 指定Spring框架的配置文件所在的位置 -->

    <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>classpath:applicationContext.xml</param-value>

    </context-param>

    <!-- 配置Struts2的核心过滤器 -->

    <filter>

    <filter-name>struts2</filter-name>

    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

    </filter>

    <filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

    * 创建包结构:

    * 引入spring的配置文件、log4j、jdbc属性文件.

    * 创建页面:

    * 创建Action:

    @Namespace("/")

    @ParentPackage("struts-default")

    public class BookAction extends ActionSupport implementsModelDriven<Book>{

    private Book book = newBook();

    public Book getModel() {

        return book;

    }

    @Action(value="book_add")

    public String add(){

        System.out.println("web层添加图书...");

        return NONE;

    }

    }

    *Action---Service----Dao

    将各层类使用注解装配Spring中:

    @Controller

    @Service

    @@Repository

    完成属性注入:

    @Autowired

    @Qualifier("bookService")

    * 实体类:

    @Entity

    @Table(name="book")

    public class Book {

    @Id

    @GeneratedValue(strategy=GenerationType.IDENTITY)

    private Integer id;

    @Column(name="name")

    private String name;

    private Double price;

    public Integer getId() {

        return id;

    }

    public void setId(Integer id){

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(Stringname) {

        this.name = name;

    }

    public Double getPrice() {

        return price;

    }

    public void setPrice(Doubleprice) {

        this.price = price;

    }

    @Override

    public String toString() {

        return "Book [id=" + id + ", name=" + name +", price=" + price + "]";

    }

    }

    * 事务管理:

    * 模板注入:

    今天内容总结:

    Spring的事务管理:

    * 编程式事务:(了解)

    * 声明式事务:

    * TransactionProxyFactoryBean.

    * AOP和事务配置:(*****)

    * 基于注解事务管理:(*****)

    SSH整合:

    * SSH整合(带有hibernate配置文件)

    * 导包:

    * 配置文件:

    * Struts2+Spring

    * 两种方式:

    * Action的类由Struts框架创建.

    * Action的类由Spring框架创建.(scope=”prototype”)

    * Spring+Hibernate:

    * 在Spring框架中引入Hibernate的配置文件.

    * 管理事务:

    * DAO中注入sessionFactory.

    * SSH整合(不带Hibernate配置文件)

    * 导包:

    * 配置文件:

    * Struts2+Spring

    * 两种方式:

    * Action的类由Struts框架创建.

    * Action的类由Spring框架创建.(scope=”prototype”)

    * Spring+Hibernate

    * 把Hibernate配置信息配置到Spring中

    * 管理事务:

    * DAO中注入sessionFactory.

    * SSH注解.(**)

    * Struts2:

    * 在Action的类上

    * @Namespace(“/”)

    * @ParentPackage("struts-default")

    * 在要执行的方法上:

    * @Action

    * 把Action/Service/Dao交给Spring.

    * Action:

    @Controller("bookAction")

    @Scope("prototype")

    * Service

    @Service

    * Dao

    @Repository

    * 配置Spring中自动扫描;

    <context:component-scan base-package="cn.itcast.action,cn.itcast.service,cn.itcast.dao"/>

    * 映射:

    @Entity

    @Table(name="book")

    public class Book {

    @Id

    @GeneratedValue(strategy=GenerationType.IDENTITY)

    private Integer id;

    @Column(name="name")

    private String name;

    ...

    }

    * 配置SessionFactory:

    <!-- 配置Hibernate的其他属性: -->

    <beanid="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

        <property name="dataSource"ref="dataSource"/>

        <!-- 配置Hibernate的属性 -->

        <property name="hibernateProperties">

            <props>

                <propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

                <prop key="hibernate.show_sql">true</prop>

                <propkey="hibernate.format_sql">true</prop>

                <propkey="hibernate.hbm2ddl.auto">update</prop>

                <prop key="hibernate.connection.autocommit">false</prop>

            </props>

        </property>

        <!-- 映射扫描-->

        <property name="packagesToScan">

            <list>

                <value>cn.itcast.vo</value>

            </list>

        </property>

    </bean>

    * 事务管理:

    <!-- 事务管理器 -->

    <beanid="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory"ref="sessionFactory"/>

    </bean>

    <tx:annotation-driventransaction-manager="transactionManager"/>

    * DAO中使用Hibernate模板:

    * 手动注入HibernateTemplate:

    <beanid="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate">

        <property name="sessionFactory"ref="sessionFactory"/>

    </bean>

    * 在Dao中

    @Autowired

    @Qualifier("hibernateTemplate")

    private HibernateTemplatehibernateTemplate;


    更多学习资料:https://blog.csdn.net/ganquanzhong

                 在写完Spring+MyBatis+Spring MVC等文章后、我整理了一套完整实战文档,有需要的点击下载
  • 相关阅读:
    Python爬虫连载1-urllib.request和chardet包使用方式
    Java连载69-接受输入、用数组模拟栈
    HTML连载61-焦点图、固定定位
    Java连载68-数组的拷贝、二维数组
    [Java] MVC
    [Java] JSP
    [Java] HTTP
    [设计模式] 设计模式课程(八)--抽象工厂模式
    [设计模式] 设计模式课程(七)--工厂模式
    [刷题] 75 Sort Colors
  • 原文地址:https://www.cnblogs.com/gqzdev/p/11667321.html
Copyright © 2020-2023  润新知