脚手架系统

一个架构性很强的系统应该具备的脚手架功能有哪些?

日志系统

1、  引入springboot-aop集成jar    

          Spring-boot-start-aop

2、application.yml中启用声明

#spring配置

spring:

  #切面启用

  aop:

    proxy-target-class: true

    auto: true

3、自定义一个拦截controller的注解

package cn.annotation;

import java.lang.annotation.*;

/**

* Title: SystemControllerLog

* @date 2018年8月31日

* @version V1.0

* Description:  自定义注解,拦截controller

*/

@Target({ElementType.PARAMETER, ElementType.METHOD})//作用在参数和方法上

@Retention(RetentionPolicy.RUNTIME)//运行时注解

@Documented//表明这个注解应该被 javadoc工具记录

public @interface SystemControllerLog {

    String description() default "";

}

4、自定义一个拦截service的注解

package cn.annotation;

import java.lang.annotation.*;

/**

* Title: SystemControllerLog

* @date 2018年8月31日

* @version V1.0

* Description:  自定义注解,拦截service

*/

@Target({ElementType.PARAMETER, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface SystemServiceLog {

    String description() default "";

}


5、定义日志记录切面

package cn.annotation;

import cn.pojo.Action;

import cn.pojo.User;

import cn.service.ActionService;

import cn.utils.IpUtils;

import cn.utils.JsonUtils;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import java.lang.reflect.Method;

import java.util.Date;

/**

* Title: SystemControllerLog

* @date 2018年8月31日

* @version V1.0

* Description: 切点类

*/

@Aspect

@Component

@SuppressWarnings("all")

public class SystemLogAspect {

    //注入Service用于把日志保存数据库,实际项目入库采用队列做异步

    @Resource

    private ActionService actionService;

    //本地异常日志记录对象

    private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect.class);

    //Service层切点

    @Pointcut("@annotation(cn.annotation.SystemServiceLog)")

    public void serviceAspect(){

    }

    //Controller层切点

    @Pointcut("@annotation(cn.oa.annotation.SystemControllerLog)")

    public void controllerAspect(){

    }

    /**

    * @Description  前置通知  用于拦截Controller层记录用户的操作

    * @date 2018年9月3日 10:38

    */

    @Before("controllerAspect()")

    public void doBefore(JoinPoint joinPoint){

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        HttpSession session = request.getSession();

        //读取session中的用户

        User user = (User) session.getAttribute("user");

        String ip = IpUtils.getIpAddr(request);

        try {

            //*========控制台输出=========*//

            System.out.println("==============前置通知开始==============");

            System.out.println("请求方法" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName()));

            System.out.println("方法描述:" + getControllerMethodDescription(joinPoint));

            System.out.println("请求人:"+user.getUsername());

            System.out.println("请求ip:"+ip);

            //*========数据库日志=========*//

            Action action = new Action();

            action.setActionDes(getControllerMethodDescription(joinPoint));

            action.setActionType("0");

            action.setActionIp(ip);

            action.setUserId(user.getId());

            action.setActionTime(new Date());

            //保存数据库

            actionService.add(action);

        }catch (Exception e){

            //记录本地异常日志

            logger.error("==前置通知异常==");

            logger.error("异常信息:{}",e.getMessage());

        }

    }

    /**

    * @Description  异常通知 用于拦截service层记录异常日志

    * @date 2018年9月3日 下午5:43

    */

    @AfterThrowing(pointcut = "serviceAspect()",throwing = "e")

    public void doAfterThrowing(JoinPoint joinPoint,Throwable e){

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        HttpSession session = request.getSession();

        //读取session中的用户

        User user = (User) session.getAttribute("user");

        //获取请求ip

        String ip = IpUtils.getIpAddr(request);

        //获取用户请求方法的参数并序列化为JSON格式字符串

        String params = "";

        if (joinPoint.getArgs()!=null&&joinPoint.getArgs().length>0){

            for (int i = 0; i < joinPoint.getArgs().length; i++) {

                params+= JsonUtils.objectToJson(joinPoint.getArgs()[i])+";";

            }

        }

        try{

            /*========控制台输出=========*/

            System.out.println("=====异常通知开始=====");

            System.out.println("异常代码:" + e.getClass().getName());

            System.out.println("异常信息:" + e.getMessage());

            System.out.println("异常方法:" + (joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()"));

            System.out.println("方法描述:" + getServiceMethodDescription(joinPoint));

            System.out.println("请求人:" + user.getUsername());

            System.out.println("请求IP:" + ip);

            System.out.println("请求参数:" + params);

            /*==========数据库日志=========*/

            Action action = new Action();

            action.setActionDes(getServiceMethodDescription(joinPoint));

            action.setActionType("1");

            action.setUserId(user.getId());

            action.setActionIp(ip);

            action.setActionTime(new Date());

            //保存到数据库

            actionService.add(action);

        }catch (Exception ex){

            //记录本地异常日志

            logger.error("==异常通知异常==");

            logger.error("异常信息:{}", ex.getMessage());

        }

    }

    /**

    * @Description  获取注解中对方法的描述信息 用于service层注解

    * @date 2018年9月3日 下午5:05

    */

    public static String getServiceMethodDescription(JoinPoint joinPoint)throws Exception{

        String targetName = joinPoint.getTarget().getClass().getName();

        String methodName = joinPoint.getSignature().getName();

        Object[] arguments = joinPoint.getArgs();

Class targetClass = Class.forName(targetName);

        Method[] methods = targetClass.getMethods();

        String description = "";

        for (Method method:methods) {

            if (method.getName().equals(methodName)){

                Class[] clazzs = method.getParameterTypes();

                if (clazzs.length==arguments.length){

                    description = method.getAnnotation(SystemServiceLog.class).description();

                    break;

                }

            }

        }

        return description;

    }

    /**

    * @Description  获取注解中对方法的描述信息 用于Controller层注解

    * @date 2018年9月3日 上午12:01

    */

    public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {

        String targetName = joinPoint.getTarget().getClass().getName();

        String methodName = joinPoint.getSignature().getName();//目标方法名

        Object[] arguments = joinPoint.getArgs();

        Class targetClass = Class.forName(targetName);

        Method[] methods = targetClass.getMethods();

        String description = "";

        for (Method method:methods) {

            if (method.getName().equals(methodName)){

                Class[] clazzs = method.getParameterTypes();

                if (clazzs.length==arguments.length){

                    description = method.getAnnotation(SystemControllerLog.class).description();

                    break;

                }

            }

        }

        return description;

    }

}

6、开始使用

    1)@SystemControllerLog(description = "")

          注解加在控制器中方法上面,括号里写上操作描述


    2)用于监控service异常,可以不使用

        @SystemServiceLog(description = "")

        注解加在service层方法上面,括号里写上操作描述

(此处为AOP拦截Service记录异常信息。方法不需要加try-catch)

————————————————

版权声明:本文为CSDN博主「WoddenFish」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/WoddenFish/java/article/details/82593850

异常捕获系统

补偿服务系统

MyBatis优化服务

常用工具类

属性拷贝

日期工具类

Excel工具类

http工具类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • -- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell--*执行DOS各种命令,结果以文本行...
    overad阅读 2,406评论 0 13
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,055评论 0 13
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,446评论 0 9
  • KIN184 月亮的黄种子 种子开花,伴有鹰的长远视野,整个过程,要有一种耐心,实现过程即使有不同因素(对于当下你...
    桥墩阅读 618评论 0 0
  • “世界并不是一锤子买卖的静态世界,而是动态平衡风云更替的。 你有美貌,美貌消逝的时候,你用美貌换来的所有福利都会反...
    坤玲的定投世界阅读 903评论 0 1