Spring
Spring的AOP的注解
AOP注解的入门
- 创建项目,引入jar包
- 创建接口跟实现类
将类的创建交给Spring
123<!-- 配置目标类--><bean id="customerDao" class="com.itheima.aop.demo1.CustomerDaoImpl"></bean>编写切面类
- 开启AOP的注解
<aop:aspectj-autoproxy />
- 切面类的注解开发
@Aspect
- 在方法上加注解
- 前置增强
@Before(value="execution(* com.spring...)")
- 后置增强,可以添加返回值
@AfterReturning(value="execution(* com.spring...)",returning="obj")
- 环绕增
@Around(value="execution(* com.spring...)")
- 异常捕获,可以获得异常信息
@AfterThrowing(value="execution(* com.spring...)",throwing="ex")
- 最终增强
@After(value="execution(* com.spring...)")
- 前置增强
- 可以把切入点注解提取出来,在最后加一个没有内容的方法,然后上面注解加这个,然后,上面的每一个方法上需要切入哪,只需要在value中加一个
类名.方法名
即可。
|
|
Spring的JDBC
Spring 的JDBC的模板
Spring是EE开发的一站式框架,一站式框架就有每层的解决方案(包括持久层)。
Spring的JDBC模板的入门
spring里面了很多对于持久层的解决方案。(JDBC,hibernate均有)
- 创建项目,引入Spring的需要的jar包,还有Spring核心包中的两个包
jdbc
,tx
还有连接数据库的包connection
,Spring的版本还需要引入AOP
的包 - 使用JDBC的模板
|
|
- 这种方法是不好的,因为每次使用的时候还需要创建连接池,所以把连接池交给Spring管理
把连接池交给Spring管理
- 创建xml配置文件,引入beans的约束
- 配置内置连接池
|
|
- 把JDBC的模板交给Spring管理
|
|
- 测试类:
用JUnit跟Springde整合1234567891011@RunWith(SpringJUnit4ClassRunner.class)@contextConfiguration("classpath:applicationContext.xml")public class JdbcTemplateDemo2{ @Resource(name="jdbcTemplate") private JdbcTemplate jdbcTemplate; @Test public void demo01(){ jdbcTemplate.update("insert into account values (?,?)","张三",100d),; }}
引入外界连接池
dpcp连接池
- 导包:依赖包中apache的commons中的dpcp跟pool,用之前的也行,跟这个一样
- 配置DBCP连接池
|
|
- 测试跟默认的一样
c3p0的连接池
- 导包,依赖包中c3p0的包
- 配置连接池,注意:配置属性跟之前的不一样
|
|
提取属性文件(连接数据库的信息)
即使用配置文件,如果需要把项目交给别人也要改配置文件,所以提取出一个属性文件,改的时候只改属性文件即可
定义属性文件
jdbc.properties
在Spring中配置文件引入属性文件:
- 通过
<bean>
引入123<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath:jdbc.prorerties"></bean>
在配置配置文件:
- 但不经常用这个,经常用context标签引入12345678<context:property-placeholder location="classpath:jdbc.prorerties"><!-- 配置C3P0连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${jdbc.user}" /><property name="password" value="${jdbc.password}" /></bean>
JDBC模板进行CURD操作
增删改
- 增删改的方法是通用的:
- update(sql语句,参数);
查询
- 单个数 :
T queryForObject(String sql,Class/<T/> requiredType,Object… args)
- 某个对象 :
T queryForObject(String sql,RowMapper/<T/> rowMapper ,Object… args);
- List集合 :
List/<T/> query(String sql,RowMapper/<T/> rowMapper,Object… args);
查询属性
12//查询id为1的账号的名称String name=jdbcTemplate.queryForObject(sql语句,String.class,Object 参数);统计个数
1Long count=jdbcTemplate.queryForObject(sql语句,Long.class,Object 参数);查询某个对象
- RowMapper类似于DBUtils中的 ResultSetHandler
|
|
- 查询多个对象
|
|
Spring的事务
Spring的事务管理
事务的回顾
- 事务的概念:
- 逻辑上一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败
- 事务的特性:
- 原子性
- 一致性
- 隔离性
- 持久性
- 如果不考虑隔离性引发安全问题
- 读问题
- 脏读
- 不可重复读
- 虚读
- 写问题
- 丢失更新
- 读问题
- 解决读问题
- 设置事务隔离级别
- read uncommitted
- read committed
- repeatable read
- serializable
- 设置事务隔离级别
Spring的事务管理的API
- PlatformTransactionManager:平台事务管理器(Spring中真正管理事务的对象)
DataSourceTransactionManager
:使用JDBC操作进行事务管理时候使用HibernateTransactionManager
:使用Hibernate框架进行事务管理时候使用
- TransactionDefinition :事务的定义信息
- 事务的隔离级别
- 事务的传播行为
- 事务是否只读
- 事务超时信息
- TransactionStatus :事务的状态对象
- 是否已经完成
- 是否有保存点
- 三个对象的关系:
- Spring通过TransactionDefinition对事务进行定义,使用PlatformTransactionManager根据定义信息进行事务的管理,在事务管理过程中产生一些状态,将状态存入到TransactionStatus中。
事务的传播行为的作用和含义
事务传播行为的作用
- 事务的传播行为:解决复杂的事务的操作,业务层之间代码的相互调用 propagation
- 事务的传播行为:解决复杂的事务的操作,业务层之间代码的相互调用 propagation
事务传播行为的取值:记标红的那个即可,主要是第一个
根据上两幅图做出的解释:
Spring的事务管理的方式
- 编程式事务管理: 手动编写代码实现事务管理
- 声明式事务管理: 通过配置实现事务管理
- xml的配置方式
- 注解方式
Spring的事务管理实现:
搭建事务管理的基本环境
用转账的案例,先写出JDBC模板:
- 编写Dao
|
|
- 配置Dao
|
|
- 编写Service
|
|
- 配置Service
|
|
- 编写测试类
|
|
编程式事务管理
- 配置事务管理器: 注:事务管理器的名称必须是
transactionManager
|
|
- 配置事务管理模板
|
|
- 在业务层注入事务管理的模板
|
|
- 改写业务层
|
|
声明式事务管理(底层用的就是AOP)
XML方式
- 引入Aop的jar包
- 恢复一下转账的环境
配置事务管理器
1234<!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean>配置事务的增强(规范)
123456789101112131415<!-- 配置事务的增强(规范) --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- <tx:method name="save*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="find*" read-only="true"/> --><tx:method name="transfer" propagation="REQUIRED"/></tx:attributes></tx:advice>//propagaion :传播行为isolation :隔离级别read-only :是否为只读rollback-for :发生哪些异常事务会回滚,默认情况下,任何异常都会回滚no-rollback-for :发生哪些异常事务不会回滚AOP的配置
|
|
注解方式
- 恢复开发环境
- 配置事务管理器
- 开启注解事务
|
|
- 在要加注解的类上加一个
@Transactional
- 要想加属性后边加一个(),按提示写
- 要想加属性后边加一个(),按提示写