Spring框架使用内幕之事务管理以及三大框架整合



spring框架使用内幕(三)

 内容

  • Spring的事务管理

  • 三大框架整合

内幕(三)的内容回顾:

SpringAOP开发:

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

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

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

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

* AOP术语:

* JoinPoint:可以被拦截点.

* Ponitcut:真正被拦截.

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

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

* Target:目标对象.

* Proxy:代理对象.

* Weaving:

* Aspect:

 

* SpringAOP的开发:

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

* 使用ProxyFactoryBean类生产代理:

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

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

 

* 采用Spring自动代理:

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

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

 

* SpringAspectJ的切面开发.

* 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>

 

SpringJDBCTemplate:

* 配置连接池:

* 默认

* 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 : 使用Spring JDBCiBatis 进行持久化数据时使用

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有事务,BA的事务挂起,重新创建一个新的事务.(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=InnoDB AUTO_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.xmllog4j.propertiesjdbc.properties

 

创建类:

* AccountService

* AccountDao

 

Spring中注册:

<!-- 业务层类 -->

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

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

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

</bean>

<!-- 持久层类 -->

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

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

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

</bean>

 

编写一个测试类:

1.1.5 Spring的事务管理:

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

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

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

 

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

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

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

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

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

</bean>

 

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

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

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

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

</bean>

 

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

<!-- 业务层类 -->

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

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

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

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

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

</bean>

 

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

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

transactionTemplate.execute(new TransactionCallbackWithoutResult() {

@Override

protected void doInTransactionWithoutResult(TransactionStatus status) {

accountDao.out(from, money);

int d = 1 / 0;

accountDao.in(to, money);

}

});

}

 

手动编码方式缺点:

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

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

基于TransactionProxyFactoryBean.

导入:aop相应jar.

 

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

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

<bean id="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"/>

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

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

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

<property name="transactionAttributes">

<props>

<prop key="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">

 

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

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

<bean id="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:method name="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">

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

</bean>

 

第二步:注解事务:

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

<tx:annotation-driven transaction-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>

 

    <constant name="struts.devMode" value="true" />

 

    <package name="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事务管理

spring-tx-3.2.0.RELEASE.jar

Spring整合其他ORM框架

spring-orm-3.2.0.RELEASE.jar

Springweb中使用

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>

 

Hibernatejar包导入:

* 核心包: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 Struts2Spring的整合:  

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>

 

  1. 编写Action:

    public class BookAction extends ActionSupport implements ModelDriven<Book>{

    // 模型驱动类

    private Book book = new Book();

    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 Struts2Spring的整合两种方式:

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

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

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

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

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

<action name="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对象.

* 通过WebAppolicationContextgetBean(“”);

 

实际开发中:

* 引入了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.通过LocalSessionFactoryBeanspring中直接引用hibernate配置文件

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

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

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

</bean>

 

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

* DAO继承HibernateDaoSupport.

<!-- DAO的配置 -->

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

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

</bean>

 

改写DAO:继承HibernateDaoSupport.

public class BookDao extends HibernateDaoSupport{

 

public void save(Book book) {

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

this.getHibernateTemplate().save(book);

}

 

}

 

  1. 创建一个映射文件 :

    <hibernate-mapping>

    <class name="cn.itcast.vo.Book" table="book">

    <id name="id">

    <generator class="native"/>

    </id>

    <property name="name"/>

    <property name="price"/>

    </class>

    </hibernate-mapping>

     

  2. 别忘记事务管理:

    事务管理器:

    <!-- 管理事务 -->

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

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

    </bean>

     

  3. 注解管理事务:

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

    <tx:annotation-driven transaction-manager="transactionManager"/>

     

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

    @Transactional

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

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

Hibernate配置文件中的信息 :

* 连接数据库基本参数:

* Hibernate常用属性:

* 连接池:

* 映射:

 

Hibernate配置文件整合Spring:

连接池:

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

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

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

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

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

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

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

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

</bean>

Hibernate常用属性:

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

<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="hibernate.connection.autocommit">false</prop>

</props>

</property>

 

映射

<!-- <property name="mappingResources">

<list>

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

</list>

</property> -->

<property name="mappingDirectoryLocations">

<list>

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

</list>

</property>

1.2.5 HibernateTemplateAPI:

 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(DetachedCriteria criteria)   :离线条件查询.

 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的配置文件、log4jjdbc属性文件.

 

* 创建页面:

* 创建Action:

@Namespace("/")

@ParentPackage("struts-default")

public class BookAction extends ActionSupport implements ModelDriven<Book>{

private Book book = new Book();

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(String name) {

this.name = name;

}

public Double getPrice() {

return price;

}

public void setPrice(Double price) {

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的其他属性: -->

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

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

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

<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="hibernate.connection.autocommit">false</prop>

</props>

</property>

<!-- 映射扫描 -->

<property name="packagesToScan">

<list>

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

</list>

</property>

</bean>

 

* 事务管理:

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

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

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

</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

 

* DAO中使用Hibernate模板:

* 手动注入HibernateTemplate :

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

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

</bean>

* Dao

@Autowired

@Qualifier("hibernateTemplate")

private HibernateTemplate hibernateTemplate;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值