简单描述解决办法
编写一个业务类的父类,定义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后,在测试类中经过测试后各业务类都正常运行。
完事
还不快抢沙发