pointcut注解_自定义注解实现aop,高效实现业务需求

1业务场景,如要在用户办理完业务以后实现计件功能,完成相关的计酬工作。

本次任务业务逻辑虽然不难,但是工作量比较大,我在做的过程中进行操作升级,充分利用spring aop 特性 ,完成了代码逻辑 实现了工作效率40%的提升。

问题解决过程;

首先想到的是写一个公共方法,在每次需要计件的方法后面新增公共的方法;这样做会导致大量的重复代码,而且后续修改也不是很方便;于是想到了了aop,但是aop的配置只是在特定的包下或者特定的方法下面实现切面的逻辑,传统的配置并不能满足本次的要求;

于是我就想到了之前的 java自定义注解加反射实现代码逻辑的操作;想想自定义注解加aop也可以灵活实现对应方法的切面逻辑,因为每个方法名字不一样,我只是需要在需要计件的方法上加上我的自定义注解实现后置处理就可以,代码量减少了很多,也提高工作效率。

实现过程如下;

1定义自定义注解;

![image.png](https://upload-images.jianshu.io/upload_images/11186073-0ade4084fd662172.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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中添加<aop:aspectj-autoproxy proxy-target-class="true"/>

5问题完美解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值