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




  • 相关阅读:
    Navsion二次开发_学习笔记
    《软件开发者路线图:从学徒到高手》笔记
    Concurrency并发性
    Excel VBA 函数
    在excel worksheet中添加button 和对Excel workbook做权限控制相关的新知识
    outline (group) 在Excel worksheet 中
    自主学习进度(软件工程)
    四则运算实现2(JAVA)
    简单四则运算实现(JAVA)
    数学建模(Lingo)(非线性整数规划)
  • 原文地址:https://www.cnblogs.com/atimo/p/10894170.html
Copyright © 2020-2023  润新知