項目中使用到的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值代表不同類型的消息。

 

 

 

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM