代码:spring05-1
1.切面注解形式
步骤:
1.在xml文件中开启切面注解
<!--开启切面注解 -->
<aop:aspectj-autoproxy/>
2.配置切面
@Aspect
public classMyAspect
3.配置切入点
@Pointcut(value="execution(*service..*(..))")
public voidpointcut(){
}
4.配置通知
@Before(value="pointcut()")/导切面包下的 另一个包是测试的 导入后测试先测这个
public voidbefore(){
System.out.println("我是前置通知");
}
2.切入点的写法
@Around(value="execution(*service.PersonServiceImpl.find())")
这样的写法只能在当前的通知中使用
@Pointcut(value="execution(*service..*(..))")
public voidpointcut(){
}//使用了切面注解执行顺序不由人控制了,先执行环绕通知,再执行前置通知
当使用方法时 这样能做到切入点的重用。
3.环绕通知同的joinPoint.proceed()方法的作用
作用:
执行下一个通知。如果没有下一个通知,才执行目标方法。
意义:
多个环绕通知在一个切入点上将会嵌套执行。4.Spring与JDBC整合(c3p0链接池)
<!--配置数据源 -->
<beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">
<propertyname="driverClass"value="${c3p0.driver}"></property>
<propertyname="jdbcUrl" value="${c3p0.url}"></property>
<propertyname="user" value="${c3p0.user}"></property>
<propertyname="password"value="${c3p0.password}"></property>
</bean>5、JDBCTemplate 模板(一般实际开发中不用)
Mybates更高级的数据库连接
<!--jdbc模板 -->
<bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
<propertyname="dataSource" ref="dataSource"></property>
</bean>
更新:
dao层代码
@Override
public voidupdateUser(User user) {
String sql ="update user set name=?,salary=?,sex=? where id=?";
jdbcTemplate.update(sql,user.getName(),user.getSalary(),user.getSex(),user.getId());
}
查询单个:
@Override
public UserfindOne(int id) {
String sql ="select * from user where id =?";
User user =jdbcTemplate.queryForObject(sql, userMapper,id);
System.out.println("执行查询操作");
return user;
}
查询所有:
Mapper
@Component
public classUserMapper implements RowMapper<User>{
@Override
public UsermapRow(ResultSet set, int index) throws SQLException {
User user = newUser();
user.setId(set.getInt("id"));
user.setName(set.getString("name"));
user.setSalary(set.getInt("salary"));
user.setSex(set.getString("sex"));
return user;
}
}
分层
代码:spring05-6
在分层上添加简单业务(在查找find中添加切面缓存),但是没有事务
代码:spring05-7
6.声明式事务处理
步骤:
1.导入jar包
修改配置文件的头
2.配置事务管理器
<!--1.配置事务管理器 -->
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<propertyname="dataSource" ref="dataSource"></property>
</bean>
将来统一管理数据库中的事务,注入dataSource
3.配置事务通知
<!--配置事务通知 -->
<tx:advicetransaction-manager="transactionManager" id="txAdvice">
<tx:attributes>
<tx:methodname="add*" propagation="REQUIRED"/>
<tx:methodname="update*" propagation="REQUIRED"/>
<tx:methodname="del*" propagation="REQUIRED"/>
<tx:methodname="find*" propagation="SUPPORTS"read-only="true"/>//read-only="true"这样写底层会做优化性能会提高
<tx:methodname="*" propagation="SUPPORTS"read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置事务通知
tx:method name="add*" 用来匹配目标对象的方法名,只能匹配add开头的方法
propagation="REQUIRED" 隔离级别 REQUIRED 必须添加事务
SUPPORTS 支持的 事务维持原状 原来有事务则添加事务(一个事务)事务保持一致 如果之前没有事务 则不管
vice A{
a() {
add() 添加操作 添加事务
service B.b(
find();//保持原样添加事务
update();//事务进行合并成为一个事务
);
}
}
REQUIRES_NEW 每次总是添加新的事务
read-only="true" 加快底层查询操作的时间
rollback-for="异常的全名" 当遇到某种异常时 事务回滚rollback-for="java.sql.SQLException"
no-rollback-for="异常的全名" 当遇到某种异常时 事务不回滚 no-rollback-for="java.lang.RuntimeException"
-->
<tx:advice transaction-manager="transactionManager" id="txAdvice">
<tx:attributes >
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.sql.SQLException" no-rollback-for="java.lang.RuntimeException"/><!--REQUIRED必须的 必须添加事务-->
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/><!-- read-only="true"这样配置底层会处理效率会更高,可以提高性能 -->
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
4.aop的配置
<aop:config>
<aop:pointcutexpression="execution(* service..*(..))" id="pc"/>
<aop:advisoradvice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>
5.事务的回滚策略(在代码中的添加方法中演示)
1.当遇到RuntimeException时 spring默认事务回滚。(RuntimeException错误级别比较高,会让程序死掉)
2.当遇到检查异常时,spring默认事务不回滚。(检查时异常错误级别别叫低,程序员可以自己处理的)
3.如果你想自己来控制事务是否回滚可以用如下方法:
rollback-for="异常的全名" 当遇到某种异常时 事务回滚rollback-for="java.sql.SQLException"
no-rollback-for="异常的全名" 当遇到某种异常时 事务不回滚 no-rollback-for="java.lang.RuntimeException"
<tx:method name="add*" propagation="REQUIRED" rollback-for="java.sql.SQLException" no-rollback-for="java.lang.RuntimeException"/><!--REQUIRED必须的 必须添加事务-->
这样后你就改变了spring自己的回滚方式,这样配置以后遇到检查时异常(sqlException)时回滚,遇到
Runtime
Exception时不回滚
声明式事务处理的参数
<!--配置事务通知
tx:methodname="add*" 用来匹配目标对象的方法名 只能匹配Add开头的方法
propagation="REQUIRED" 隔离级别
REQUIRED 必须添加事务
SUPPORTS 支持的 原来有事务则添加事务事务保持一致 如果之前没有事务则不管
REQUIRES_NEW 每次总是添加新的事务
read-only="true"加快底层查询操作用的时间
rollback-for="异常的全名" 当遇到某种异常时 事务回滚
no-rollback-for="异常的全名" 当遇到某种异常时 事务不回滚
service A{
a(){
add() 添加操作 添加了事务
service B.b(
//find(); //保持原样添加事务
update(); 事务进行合并成一个事务
);
}
}
-->
Spring声明式的事务处理的意义:
将来我们程序员自己无需手动的维护事务。都交给spring来完成。