1.Spring框架的AOP技术(注解方式)
1.1 案例演示
1.1.1 步骤一:引入具体的开发的jar包
Spring框架开发的IOC包(4个):
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
---------------------
日志包(2个):
com.springsource.org.apache.log4j-1.2.15.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
---------------------
Spring框架的AOP开发包(2个传统AOP开发包+2个aspectJ的开发包):
spring-aop-4.2.4.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
spring-aspects-4.2.4.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
1.1.2 步骤二:创建Spring的配置文件,引入具体的AOP的约束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
1.1.3 步骤三:创建包结构,编写具体的接口和类
CustomerDao 接口
CustomerDaoImpl 实现类
1.1.4 步骤四:将目标类配置到Spring中
<bean id="customerDao" class="pers.hdh.demo1.aop.CustomerDaoImpl" />
1.1.5 步骤五:定义切面
添加切面和通知的注解
1.1.6 步骤六:在配置文件中定义切面类
<bean id="myAspectAnno" class="pers.hdh.demo1.aop.MyAspectAnno" />
1.1.7 步骤七:在配置文件中开启自动代理
<aop:aspectj-autoproxy />
1.1.8 编写测试代码
1.2 通知类型
@Before:前置通知
@AfterReturning:后置通知
@Around:环绕通知(目标对象对象默认不执行,需要手动执行)
@After:最终通知
@AfterThrowing:异常抛出通知
2.Spring的JDBC模板技术
2.1 JDBC模板类的案例演示
2.1.1 步骤一:创建数据库的表结构
create database spring_day03;
use spring_day03;
create table t_account(
id int primary key auto_increment,
name varchar(20),
money double
);
2.1.2 步骤二:引入开发的jar包
Spring框架开发的IOC包(4个):
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
---------------------
日志包(2个):
com.springsource.org.apache.log4j-1.2.15.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
---------------------
Spring框架的AOP开发包(2个传统AOP开发包+2个aspectJ的开发包):
spring-aop-4.2.4.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
spring-aspects-4.2.4.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
---------------------
JDBC模板需要的jar包(3个):
数据库驱动jar包
spring-jdbc-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar
2.1.3 编写代码
2.2 Spring框架管理模板类
2.2.1 将原本自己手动new的方式,把类交给Spring框架管理。
步骤一:Spring管理内置的连接池
步骤二:Spring JDBC模板管理类
步骤三:编写测试代码
2.3 Spring框架管理连接池
2.3.1 管理DBCP连接池
引入DBCP的2个jar包:
com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
com.springsource.org.apache.commons.pool-1.5.3.jar
编写配置文件:
2.3.2 管理C3P0连接池
引入C3P0的Jar包
com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
编写配置文件:
2.4 JDBC模板的简单操作
2.4.1 添加/修改/删除操作
JdbcTemplate.update(String sql, Object... args)
2.4.2 查询操作
查询一条数据:JdbcTemplate.queryForObject(String sql, RowMapper<Account> rowMapper, Object... args)
查询多条数据:JdbcTemplate.query(String sql, RowMapper<Account> rowMapper)
补充:
3.Spring框架的事务管理
3.1 事务的基本概念
3.1.1 事务:指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败。
3.1.2 事务的特性:原子性、一致性、隔离性、持久性
3.1.3 不考虑隔离性可能引发的安全性问题
读问题:脏读、不可重复读、虚读。
写问题:丢失更新。
3.1.4 如何解决安全性问题
解决读问题,设置数据库隔离级别。
解决写问题,悲观锁或乐观锁。
3.2 事务管理相关的类与API
3.2.1 PlatformTransactionManager接口:
平台事务管理器。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类。
3.2.2 TransactionDefinition接口:
事务定义信息,包括事物的隔离级别、传播行为、超时、只读。
3.2.3 TransactionStatus接口:
事务的状态。
3.2.4 总结:
平台事务管理器管理事务对象,根据事务定义的信息TransactionDefinition进行事务管理,在管理事务中产生中一些状态,将状态记录到TransactionStatus中。
3.2.5 PlatformTransactionManager接口中实现类的常用方法
接口的实现类:
如果使用Spring的JDBC模板或者MyBatis框架,选择DataSourceTransactionManager实现类。
如果使用Hibernate框架,选择HibernateTransactionManger实现类。
---------------------
接口的常用方法:
void commit(TranscationStatus status);
TransactionStatus getTransaction(TransactionDefinition definition);
void rollback(TransactionStatus status);
3.2.6 TranscationDefinition
事务隔离级别的常量:
static int ISOLATION_DEFAULT
static int ISOLATION_READ_UNCOMMITED
static int ISOLATION_READ_COMMITED
static int ISOLATION_REPEATABLE_READ
static int ISOLATION_SERIALIZABLE
---------------------
事务的传播行为常量(一般使用默认值):
注:传播行为解决的是业务层之间的方法调用。
PROPAGATION_REQUIRED(默认值) -- A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!
PROPAGATION_SUPPORTS -- A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.
PROPAGATION_MANDATORY -- A中有事务,使用A中的事务.如果A没有事务.抛出异常.
PROPAGATION_REQUIRES_NEW(记) -- A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中)
PROPAGATION_NOT_SUPPORTED -- A中有事务,将A中的事务挂起.
PROPAGATION_NEVER -- A中有事务,抛出异常.
PROPAGATION_NESTED(记) -- 嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)
3.3 搭建转账案例的环境
3.3.1 步骤一:引入jar包
Spring框架开发的IOC包(4个):
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
---------------------
日志包(2个):
com.springsource.org.apache.log4j-1.2.15.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
---------------------
Spring框架的AOP开发包(2个传统AOP开发包+2个aspectJ的开发包):
spring-aop-4.2.4.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
spring-aspects-4.2.4.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
---------------------
Mysql驱动包
---------------------
C3P0的包:
com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
---------------------
JDBC包(2个):
spring-jdbc-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar
---------------------
整合JUnit测试包:
spring-test-4.2.4.RELEASE.jar
3.3.2 步骤二:引入配置文件
log4j.properties
applicationContext.xml
3.3.3 步骤三:创建对应的包结构和类
3.3.4 步骤四:将类配置到Spring中
<bean id="accountService" class="pers.hdh.AccountServiceImpl"></bean>
<bean id="accountDao" class=" pers.hdh.AccountDaoImpl"></bean>
3.3.5 步骤五:依赖注入,将JDBC模板注入Dao(注意这里看下图!),将Dao注入Service中
<bean id="accountService" class="pers.hdh.AccountServiceImpl">
<property name="accountDao" ref="accountDao" />
</bean>
<bean id="accountDao" class=" pers.hdh.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
3.3.6 步骤六:实现Dao和Service中的方法
3.3.7 步骤七:编写测试程序
3.4 事务管理的分类
3.4.1 Spring的编程式事务管理
通过手动编写代码的方式完成事务的管理。
3.4.2 Spring的声明式事务管理(推荐,底层采用AOP技术)
通过配置文件实现。
3.5 编程式的事务管理
3.5.1 步骤一:配置事务管理器,Spring使用PlatformTransactionManager接口来管理事务
3.5.2 步骤二:配置事故管理的模板类(简化开发)
3.5.3 步骤三:在需要进行事务管理的类(Service层)中注入事务管理器模板
3.5.4 步骤四:在Service层使用管理器模板对象管理事务
3.6 声明式事务管理(重点)
3.6.1 基于AspectJ的XML方式
3.6.2 基于AspectJ的注解方式
3.7 事务管理之基于AspectJ的XML方式
继续转账例子进行改造。
3.7.1 步骤一:配置事务管理器(不变)
3.7.2 步骤二:配置事务增强
3.7.3 步骤三:配置AOP的切面
3.7.4 步骤四:编写测试程序
3.8 事务管理之基于AspectJ的注解方式(最简单)
3.8.1 步骤一:配置事务管理器(同上)
3.8.2 步骤二:开启注解事务
<tx:annotation-driven transaction-manager="transactionManager"/>
3.8.3 步骤三:在需要事务管理的类上添加注解:@Transactional
3.8.4 步骤四:编写测试程序