项目中使用到的AOP

几天前项目基本完工,此时突然来了需求。需要做一个系统消息机制。就是关于用户的一些通知类型的消息。类似知乎、csdn网页端登录后会有消息提示

此时并不需要修改每个需要添加的系统消息的地方。
而是将这需要发送系统消息的地方归为一类,分不同的标识即可。

 1 import java.lang.annotation.ElementType;  
 2 import java.lang.annotation.Retention;  
 3 import java.lang.annotation.RetentionPolicy;  
 4 import java.lang.annotation.Target;
 5 /***
 6  * flag 1-认证 2-邀请 3-活动 4-礼品 5-个人中心 
 7  * @author
 8  */
 9 @Target({ElementType.METHOD, ElementType.TYPE})  
10 @Retention(RetentionPolicy.RUNTIME) 
11 public @interface SysMessage {
12     String flag() default "";
13 }

1.这里自定义一个接口,用来接收不同种类的消息。↑

 1     @Around("@annotation(sysMessage)")  
 2     public synchronized Object arround(ProceedingJoinPoint pjp,SysMessage sysMessage) { 
 3         try {  
 4             Object o =  pjp.proceed();  //o 返回值  ResponseObj
 5             Sysmsg sysmsg = new Sysmsg();
 6             if(Integer.parseInt(sysMessage.flag()) == 1){
 7                 if(((ResponseObj) o).getErrcode() == 0 ){
 8                     sysmsg.setUserId((Integer)pjp.getArgs()[0]);
 9                     sysmsg.setContent("平台认证未通过,请前往<a href='https://cnblogs.com/atimo'>个人中心</a>重新认证");
10                     sysmsg.setMsgType(Integer.parseInt(sysMessage.flag()));
11                     sysmsg.setIsRead(false);
12                     sysmsg.setSendTime(new Date());
13                     sysmsg.setDeleteFlag(false);
14                     msgService.addSysmsg(sysmsg);
15                 }
16             }
17         }    

2.这里我使用的是环切,这里要加注解.↑
 @Around("@annotation(sysMessage)")  
其中sysMessage自定义接口名称,首字母小写,即可。

这里是接收消息端,通过  ProceedingJoinPoint  类可获取到controller控制层调用时返回的信息。
controller无论成功与否,根据返回的消息判断是否需要添加消息。
3.下面是调用时只需注明是什么类型的消息请求即可

 1     @ResponseBody
 2     @RequestMapping(value="/checkid")
 3     @SysMessage(flag = "1")
 4     public Object checkid(Integer userId,String idname,Integer status){
 5         try{
 6             if(this.carownerService.checkid(userId,idname,status) > 0){
 7                 return getResponse(0, "ID审核成功!");
 8             }else{
 9                 return getResponse(1, "ID审核失败!");
10             }
11         }catch (Exception e) {
12             e.printStackTrace();
13             logger.error("审核ID时:" + e.toString());
14             return getResponse(-1);
15         }
16     }

这里加上 @SysMessage(flag = "1") 

注解为自定义的接口名,flag值即为传输过去的类型值,后台处理消息根据传入的flag值代表不同类型的消息。

 

 

 

 




posted @ 2019-05-20 14:58  atimo  阅读(1921)  评论(0编辑  收藏  举报