关于一次aop的经验
公司最近要求在某些程序出异常的时候,发封邮件至某个coder,用来及时检查问题所在,要求详细知道哪个类,哪个方法出的异常,出的什么异常等,而且不修改以前的程序代码!
于是想到了spring的AOP.想到了其中的ThrowsAdvice接口,这是用来再程序出了异常之后拦截,而后添加功能的.
本以为很简单,于是简单些了下测试类,测试的业务类没有实现接口,就是一个java类,本身应用了spring的申明事务.步骤如下:
1.先写一个pojo的advice通知:
之后运行,发现错了,原因在于我的测试业务类没有实现某一接口,因为事务管理用了AOP,我的advice又用了AOP,事务管理时我的业务类成了proxy,应用我的advice时,proxy无法类型转换至业务类,报错.后来又了解决方式,就是指定proxyTargetClass的值为true,强制使用cglib生成子类,代码如下:
但是这样做的后果就是拦截器重复拦截,因为2个AOP功能,2个子类,同时起作用,就拦截了2次.解决方案:把我的业务类换成接口,方法调用改成接口调用.
本以为可以了,但是发现advice的method,target参数无法得到,配置如下:
无法给通知传参,只能得到一个exception类型的参数,得不到method,target等参数,琢磨了2小时,没有解决,头昏脑胀!
休息一小时,继续琢磨,得到正确解决方式:
1.写一个依赖于spring的advice:
解决问题!
************************************************************************************************
可是由于公司项目业务层是java类,又不能修改以前的代码,只能采用链式加AOP的方式去做了:
程序中最后调用"boLogin"这个spring Bean 就没有问题了.
Ok!解决!