自定义注解结合aop,高效实现业务需求

1业务场景,如要在用户办理完业务以后实现计件功能,完成相关的计酬工作。
本次任务业务逻辑虽然不难,但是工作量比较大,我在做的过程中进行操作升级,充分利用spring aop 特性 ,完成了代码逻辑 实现了工作效率40%的提升。
问题解决过程;
首先想到的是写一个公共方法,在每次需要计件的方法后面新增公共的方法;这样做会导致大量的重复代码,而且后续修改也不是很方便;于是想到了了aop,但是aop的配置只是在特定的包下或者特定的方法下面实现切面的逻辑,传统的配置并不能满足本次的要求;
于是我就想到了之前的 java自定义注解加反射实现代码逻辑的操作;想想自定义注解加aop也可以灵活实现对应方法的切面逻辑,因为每个方法名字不一样,我只是需要在需要计件的方法上加上我的自定义注解实现后置处理就可以,代码量减少了很多,也提高工作效率。
实现过程如下;
1定义自定义注解;

image.png

2完成切面方法 我移除了自己的业务代码
@Component
@Aspect
@Lazy(false)
public class StartFireOrderSynUtilsPlanB {
private Logger logger = LoggerFactory.getLogger(StartFireOrderSynUtilsPlanB.class);
private final static String intfName = "Activity/starFireOrderDetailSyn";
/**
* 定义切入点:对要拦截的方法进行定义与限制,如包、类
*
* 1、execution(public * (..)) 任意的公共方法
* 2、execution(
set(..)) 以set开头的所有的方法
* 3、execution(
com.lingyejun.annotation.LoggerApply.(..))com.lingyejun.annotation.LoggerApply这个类里的所有的方法
* 4、execution(
com.lingyejun.annotation..(..))com.lingyejun.annotation包下的所有的类的所有的方法
* 5、execution(* com.lingyejun.annotation...(..))com.lingyejun.annotation包及子包下所有的类的所有的方法
* 6、execution(* com.lingyejun.annotation...(String,?,Long)) com.lingyejun.annotation包及子包下所有的类的有三个参数,第一个参数为String类型,第二个参数为任意类型,第三个参数为Long类型的方法
* 7、execution(@annotation(com.lingyejun.annotation.Lingyejun))
*/
@Pointcut("@annotation(com.ai.ecs.web.sys.utils.Paycount)")
private void cutMethod() {

}
/**
 * 后置通知:在目标方法执行后调用,若目标方法出现异常,则不执行  后置通知完成计件
 */
@AfterReturning(returning = "result",pointcut ="cutMethod()")
public void afterReturning(JoinPoint joinPoint,Object result) {
    JSONObject  jobj =(JSONObject) result;//目标方法返回值
    String resultCode = JsonUtils.isBlank(jobj) ? "null" : String.valueOf(jobj.get("X_RESULTCODE"));// 返回编码
    Object[] args = joinPoint.getArgs();//获取参数方法
    HttpServletRequest request = (HttpServletRequest)args[0];
    String goodsId = request.getParameter("goodsId");
    logger.info("==@AfterReturning==  logger : after returning"+goodsId);
    System.out.println("==@AfterReturning==  logger : after returning"+goodsId);
    //添加计件功能
    String  assistantUserInfo  = request.getParameter("assistantUserInfo");
    String goodsname = request.getParameter("goodsName");
    String orderType = request.getParameter("orderType");//前台传
    String baseUrl = request.getParameter("url");//商品地址
}

}
3然后在计件方法上加上@Paycount注解即可
4然后发现不起作用,最后在xml中添加
5问题完美解决。

你可能感兴趣的:(自定义注解结合aop,高效实现业务需求)