spring的AOP调用(二)DAO层的AOP实现保存基础表数据

spring的AOP调用(二)DAO层的AOP实现保存基础表数据

要达到的目的是,很多表都继承自了一个BizOrder的业务单基表,存放的是业务单的状态,单号等数据。所以在保存一个库存单的时候,就要
第一步:先保存BizOrder表
第二步:保存PioAccept表
在manager里面要调用两个不同的DAO来实现这个功能。目前是将第一个事情交给AOP的实现类来完成。平时coder在完成代码时,只用
一步:保存PioAccept表

AOP的spring配置文件core-context.xml的片段如下:
<aop:config>
<!-- 配置功能实现类 -->
<aop:aspect ref="bizOrderAOP">
<!-- 拦截save名字打头的方法,并传递参数Object obj -->
<aop:pointcut id="theExecutionOfBizOrderSaveMethod"
expression="execution(* cn.sccl..*.dao.*DAO.save*(Object)) and args(obj)" />
<!-- 拦截delete名字打头的方法 -->
<aop:pointcut id="theExecutionOfBizOrderDeleteMethod"
expression="execution(* cn.sccl..*.dao.*DAO.delete*(..))" />
<!-- save的时候调用的实现类里面的方法名 -->
<aop:around pointcut-ref="theExecutionOfBizOrderSaveMethod"
method="saveBizOrder" />
<!-- delete的时候调用的实现类里面的方法名 -->
<aop:around pointcut-ref="theExecutionOfBizOrderDeleteMethod"
method="deleteBizOrder" />
</aop:aspect>
</aop:config>

我们的AOP操作实现类BizOrderAOPImpl.java:
package cn.sccl.base.aop;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Service;
import cn.sccl.base.dao.BizOrderDAO;
import cn.sccl.construction.model.PioAccept;
@Service("bizOrderAOP")
public class BizOrderAOPImpl {
<!-- 注入基类的DAO -->
private BizOrderDAO bizOrderDAO;
private static Log log = LogFactory.getLog(BizOrderAOPImpl.class);
@Resource(name = "bizOrderDAO")
public void setBizOrderDAO(BizOrderDAO bizOrderDAO) {
this.bizOrderDAO = bizOrderDAO;
}
<!-- 保存时调用的方法其中的Object是传递过来的方法参数,我这里是PioAccept,实际用的时候需要instanceof吧。 -->
public Object saveBizOrder(ProceedingJoinPoint call,Object obj) throws Throwable {
<!-- 方法名,得到形如:execution(save) -->
log.debug("method name is : " + call.toShortString());
<!-- 得到参数 -->
log.debug("args is : " + obj);
PioAccept pio = (PioAccept)obj;
<!-- 断点调试了,可以update参数 -->
pio.setBizOrderId(1111);
log.debug("ivoke method is : " + bizOrderDAO);
try {
return call.proceed();
} finally {
// if (true) {
// throw new RuntimeException("kill all!");
// }
}
}
public Object deleteBizOrder(ProceedingJoinPoint call) throws Throwable {
log.debug("method name is : " + call.toShortString());
log.debug("args is : " + call.getArgs()[0].toString());
log.debug("ivoke method is : " + bizOrderDAO);
try {
return call.proceed();
} finally {
// if (true) {
// throw new RuntimeException("kill all!");
// }
}
}
}

先在AOP中保存BizOrder表,然后保存自己的业务表,同时操作了两个表,事务要保证,所以这个AOP配置在了DAO层。

正常情况的save方法日志:

启动事务
11-17 17:43:42 [DEBUG] org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) - Creating new transaction with name [cn.sccl.common.service.BaseManager.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

11-17 17:43:47 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202) - Acquired Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver] for JDBC transaction

11-17 17:43:47 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) - Switching JDBC Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver] to manual commit

调用AOP方法,得到如下参数
11-17 17:43:47 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:25) - method name is : execution(save)

11-17 17:43:47 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:26) - args is : cn.sccl.base.model.BizOrder@75c78d

11-17 17:43:47 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:27) - ivoke method is : cn.sccl.base.dao.impl.BizOrderDAOImpl@800aa1

11-17 17:43:48 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:25) - method name is : execution(save)

11-17 17:43:48 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:26) - args is : cn.sccl.construction.model.PioAccept@b8d09d

11-17 17:43:48 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:27) - ivoke method is : cn.sccl.base.dao.impl.BizOrderDAOImpl@800aa1

11-17 17:43:48 [DEBUG] org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:730) - Initiating transaction commit

提交事务
11-17 17:43:48 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:259) - Committing JDBC transaction on Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver]

11-17 17:43:48 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion(DataSourceTransactionManager.java:314) - Releasing JDBC Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver] after transaction

模拟出错时,抛出RuntimeException的日志如下:

启动事务
11-17 17:48:23 [DEBUG] org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) - Creating new transaction with name [cn.sccl.common.service.BaseManager.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

11-17 17:48:26 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202) - Acquired Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver] for JDBC transaction

11-17 17:48:26 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) - Switching JDBC Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver] to manual commit

调用AOP方法
11-17 17:48:26 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:25) - method name is : execution(save)

11-17 17:48:26 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:26) - args is : cn.sccl.base.model.BizOrder@41a12f

11-17 17:48:26 [DEBUG] cn.sccl.base.aop.BizOrderAOPImpl.saveBizOrder(BizOrderAOPImpl.java:27) - ivoke method is : cn.sccl.base.dao.impl.BizOrderDAOImpl@bd4e3c

11-17 17:48:27 [DEBUG] org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:821) - Initiating transaction rollback

AOP方法中有错误,回滚操作
11-17 17:48:27 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:273) - Rolling back JDBC transaction on Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver]

11-17 17:48:27 [DEBUG] org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion(DataSourceTransactionManager.java:314) - Releasing JDBC Connection [jdbc:oracle:thin:@10.206.20.5:1521:ccdev, UserName=DEV, Oracle JDBC driver] after transaction
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值