简单描述解决办法

编写一个业务类的父类,定义setSession方法,所有业务类继承之并且也定义同名setSession方法,这样在advice的@around方式编写时遇到ProceedingJoinPoint(pjp)拦截目标(Target)并设置session时,就可以直接用父类接受强转,自动转换成需要的类型了,达到了代码的复用。

原本ProceedingJoinPoint(pjp)拦截目标(Target)并设置session的代码
(以产品业务实现类ProductServiceImpl对应的Advice为例)

if(pjp.getTarget() instanceof ProductServiceImpl) {
        ((ProductServiceImpl)pjp.getTarget()).setSession(session);
    }

如果有多个业务类,每个业务类对应的AOP的Advice实际就这有这里不同,但是会出现大量重复代码,
所以在业务类的包下,创建父类并在父类中定义setSession方法来解决:

public class ServiceImpl {
private Session session=null;
public void setSession(Session session) {
    this.session=session;
}

然后所有需要复用的业务类都继承之,比如ProductServiceImpl:

        public class ProductServiceImpl extends ServiceImpl implements IProductService {
        private Session session=null;
        public void setSession(Session session) {
            this.session=session;
        }
           //这里省略了增删改查等方法
    }

这样就可以只为所有业务类写一个AOP的Advice:

@Around("com.bambovc.sh01.aop.ProjectAOPPointcut.serviceAllMethodPointCut()")
public Object aroundAllTransaction(ProceedingJoinPoint pjp)throws Throwable{
    Session session=sf.openSession();
    Transaction tx=session.beginTransaction();
    if(pjp.getTarget() instanceof ServiceImpl) {
        ((ServiceImpl)pjp.getTarget()).setSession(session);
    }//注意此处全部使用父类ServiceImpl即可
    Object result=pjp.proceed();
    tx.commit();
    session.close();
    return result;
}

把用到的业务类都继承ServiceImpl后,在测试类中经过测试后各业务类都正常运行。
完事


本文由 bambovc 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论