spring03(注解aop)

1、导包

2、编写目标类:
public class ProductDao {
public void save(){
System.out.println("保存商品...");
}
public void update(){
System.out.println("修改商品...");
}
public void delete(){
System.out.println("删除商品...");
}
public void find(){
System.out.println("查询商品...");
}
}



1.2.1.4 配置目标类:
 <!-- 目标类============ -->
 <bean id="productDao" class="cn.itcast.spring.demo4.ProductDao"></bean> 


1.2.1.5 开启 aop 注解的自动代理:
<aop:aspectj-autoproxy/>


1.2.1.6 AspectJ 的 AOP 的注解:
@Aspect:定义切面类的注解
通知类型:
 * @Before :前置通知
 * @AfterReturing :后置通知
 * @Around :环绕通知
 * @After :最终通知
 * @AfterThrowing :异常抛出通知.
@Pointcut:定义切入点的注解


1.2.1.7 编写切面类:
@Aspect
public class MyAspectAnno {
@Before("MyAspectAnno.pointcut1()")
public void before(){
System.out.println("前置通知===========");
}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.save(..))")
private void pointcut1(){}
}


1.2.1.8 配置切面:
 <!-- 配置切面类 -->
 <bean id="myAspectAnno" class="cn.itcast.spring.demo4.MyAspectAnno"></bean> 


1.2.1.9 其他通知的注解:
@Aspect
public class MyAspectAnno {
@Before("MyAspectAnno.pointcut1()")
public void before(){
System.out.println("前置通知===========");
}
@AfterReturning("MyAspectAnno.pointcut2()")
public void afterReturning(){
System.out.println("后置通知===========");
}
@Around("MyAspectAnno.pointcut3()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("环绕前通知==========");
Object obj = joinPoint.proceed();
System.out.println("环绕后通知==========");
return obj;
}
@AfterThrowing("MyAspectAnno.pointcut4()")
public void afterThrowing(){
System.out.println("异常抛出通知========");
}
@After("MyAspectAnno.pointcut4()")
public void after(){
System.out.println("最终通知==========");
}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.save(..))")
private void pointcut1(){}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.update(..))")
private void pointcut2(){}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.delete(..))")
private void pointcut3(){}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.find(..))")
private void pointcut4(){}
}

 

 

1.4.4.1 什么是事务:事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败.

1.4.4.2 事务特性:原子性 :强调事务的不可分割.一致性 :事务的执行的前后数据的完整性保持一致.隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰持久性 :事务一旦结束,数据就持久到数据库

1.4.4.3 如果不考虑隔离性引发安全性问题:脏读 :一个事务读到了另一个事务的未提交的数据不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

1.4.4.4 解决读问题:设置事务隔离级别未提交读 :脏读,不可重复读,虚读都有可能发生已提交读 :避免脏读。但是不可重复读和虚读有可能发生可重复读 :避免脏读和不可重复读.但是虚读有可能发生.串行化的 :避免以上所有读问题.Mysql 默认:可重复读Oracle 默认:读已

 

 

注解事务配置:

<!-- 指定spring读取db.properties配置 -->
<context:property-placeholder location="classpath:db.properties"  />

<!-- 1.将连接池放入spring容器 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
    <property name="driverClass" value="${jdbc.driverClass}" ></property>
    <property name="user" value="${jdbc.user}" ></property>
    <property name="password" value="${jdbc.password}" ></property>
</bean>

<!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
    <property name="dataSource" ref="dataSource" ></property>
</bean>

<!-- 事物自动开始 -->
<tx:annotation-driven/>

 

使用:

@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED ,readOnly=false)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值