ssm版本:

1、首先自定义一个注解,该注解有两个属性,一个是模块名,一个是操作的内容。该注解是用来修饰Service层中的方法的。

2、创建一个切面类,该切面使用@Aspect和@Component注解修饰,该页面需要注入一个HttpSession对象。

注意:一个普通的java类是不能注入HttpSession对象的,因此需要在web.xml文件中配置

 org.springframework.web.util.IntrospectorCleanupListenerorg.springframework.web.context.request.RequestContextListener

3、在applicationContext.xml文件中配置aop:aspectj-autoproxy,扫描@Aspect注解。

springboot版本:

日志管理:
1、首先自定义一个注解,自定义的注解需要使用@Target(ElementType.METHOD),@Retention(RetentionPolicy.RUNTIME)修饰,然后给几个属性。
2、定义一个切面然后切面使用@Component,@Aspect修饰,然后定义扫描切入点表达式@After(“execution(* com.syzw.test…service…*(…))”),创建通知类型,通知类型里面可以使用 HttpServletRequest request=((ServletRequestAttributes)(RequestContextHolder.getRequestAttributes())).getRequest();去获取requet对象。
3、在该方法中就可以通过JoinPoint形参去获取实际操作对象的class类,然后就可以获取该到方法,然后可以获取到自定义的注解了就完成了日志的管理。

缺点:
如果需要进行比较信息的日志管理的话,需要在每一个操作dao接口的方法上添加自定义的注解,较为麻烦。
解决方式:
一般会在切面上判断url然后根据url去做相应的操作的,但是这种操作较不灵活。

JoinPoint是一个切入点,它封装了切入点和真实对象的一些信息。
JoinPoint常用的一些api:
getSignature():获取真实访问方法的全路径签名。
getArgs():获取传入目标方法的参数对象。
getTarget():获取被代理的对象。
getThis():获取代理对象。

Signature:
getName():获取操作的方法名。
getClass():获取方法所在的Class类。

注意:

其实每一个注解都对应了一个切面,注解只是其一个声明作用,并没有实际的意义。

使用Spring Aop自定义注解实现自动记录日志

(1)首先配置文件:

    <!-- 声明自动为spring容器中配置@aspectj切面的bean建立代理 ,织入切面 --><aop:aspectj-autoproxy /><!-- 开启注解扫描 --><context:component-scan base-package="com.ky.zhjd.**"/><!-- 为true说明代理基于类被建立(默认false,基于接口被建立) --><aop:config proxy-target-class="true"></aop:config>

(2)建立一个自定义注解类spring

注意建立时选Annotation,类名我叫ArchivesLog(日志档案的意思)。

ArchivesLog.java内容:

package com.ky.zhjd.common.log;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*** * 自定义注解类**/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ArchivesLog {/** 要执行的操做类型好比:添加操做 **/  public String operationType() default "";  /** 要执行的操做名称好比:添加一条用户数据 **/  public String operationName() default ""; }

(3)新建一个切面类,我叫LogAspect.java

package com.ky.zhjd.common.log;import java.lang.reflect.Method;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;/*** 切面类*/
@Aspect
@Component("logAspect")
public class LogAspect {private static final Logger log = LoggerFactory.getLogger(LogAspect.class);// 配置织入点@Pointcut("@annotation(ArchivesLog)")public void logPointCut() {}/*** 前置通知 用于拦截操做,在方法返回后执行* * @param joinPoint 切点*/@AfterReturning(pointcut = "logPointCut()")public void doBefore(JoinPoint joinPoint) {handleLog(joinPoint, null);}/*** 拦截异常操做,有异常时执行* * @param joinPoint* @param e*/@AfterThrowing(value = "logPointCut()", throwing = "e")public void doAfter(JoinPoint joinPoint, Exception e) {handleLog(joinPoint, e);}private void handleLog(JoinPoint joinPoint, Exception e) {try {// 得到注解ArchivesLog controllerLog = getAnnotationLog(joinPoint);System.out.println("---------------自定义注解:" + controllerLog);if (controllerLog == null) {return;}// 得到方法名称String className = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();String type = controllerLog.operationType();String name = controllerLog.operationName();// 打印日志  这里能够进行插入数据库操做log.info(">>>>>>>>>>>>>操做类型:", type);log.info(">>>>>>>>>>>>>操做名称:", name);log.info(">>>>>>>>>>>>>类名:", className);log.info(">>>>>>>>>>>>>方法名:", methodName);} catch (Exception exp) {// 记录本地异常日志log.error("==前置通知异常==");log.error("异常信息:", exp.getMessage());exp.printStackTrace();}}/*** 是否存在注解,若是存在就获取*/private static ArchivesLog getAnnotationLog(JoinPoint joinPoint) throws Exception {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null) {// 拿到自定义注解中的信息return method.getAnnotation(ArchivesLog.class);}return null;}
}

(4)在方法上使用注解 , 而后调用该方法(这里在Controller层进行操作,也可以在Service层操作)

    @ArchivesLog(operationType="查询操做",operationName="查询一条用户详情")@RequestMapping(value = "/findByid", produces={"application/json;charset=UTF-8"})public @ResponseBody BaseResult<Object> findByid(String id) {String s="11";BaseResult<Object> r=userService.findById(s);System.out.println(r+">>>>>>>>>>");return r;}

ok 上效果:

有什么不完善的地方欢迎指出,一块儿学习

java 自定义注解+AOP实现日志记录相关推荐

  1. 自定义注解-aop实现日志记录

    关于注解,平时接触的可不少,像是 @Controller.@Service.@Autowried 等等,不知道你是否有过这种疑惑,使用 @Service 注解的类成为我们的业务类,使用 @Contro ...

  2. Spring Boot自定义注解+AOP实现日志记录

    访问Controller打印的日志效果如下: *********************************Request请求*********************************** ...

  3. JPOM - AOP+自定义注解实现操作日志记录

    文章目录 地址 版本 源码解析-AOP+自定义注解实现操作日志记录 地址 Gitee: https://gitee.com/dromara/Jpom 官网: https://jpom.io/ 一款简而 ...

  4. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  5. 数据脱敏——基于Java自定义注解实现日志字段脱敏

    上文说了数据过敏主要有两个思路:第一个就是在序列化实体之前先把需要脱敏的字段进行处理,之后正常序列化:第二个就是在实体序列化的时候,对要脱敏的字段进行处理. 脱敏实现思路 这里探讨第一种方法,用基于自 ...

  6. Java自定义注解开发

    目录 一.JAVA注解 1.java注解的定义 2.java注解的分类 2.1 JDK基本注解 2.2 JDK元注解 2.3 自定义注解 3.注解分类 3.1标记Annotation: 3.2 元数据 ...

  7. springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)

    初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解.问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根 ...

  8. Java 自定义注解及使用场景

    文章目录 1 什么是注解(Annotation) 2 元注解 2.1 @Target 2.2 @Retention 2.3 @Repeatable 2.4 @Inherited 示例1 反射获取注解 ...

  9. java 自定义注解实现不同对象之间的拷贝(支持大小写、驼峰转换)

    java 自定义注解实现不同对象之间的拷贝(支持大小写.驼峰转换) 1.需求 要实现两个属性名称完全不同的对象之间的拷贝.具体如下 原对象 /*** 原实体*/ @Data public class ...

最新文章

  1. 【JAVA】使用IntelliJ IDEA创建Java控制台工程
  2. Allegro转Altium(brd2alg)
  3. SAP CRM text determination调试
  4. Java 输出当前目录
  5. 谷歌、阿里巴巴他们都来了,你呢?
  6. 用FlexGrid做开发,轻松处理百万级表格数据
  7. thinkPHP5项目上传到centOS服务器后不显示验证码图片
  8. 中文搜索引擎技术揭密-网络蜘蛛
  9. PHP调用MYSQL存储过程实例
  10. 算法渐近性质分析_神奇宝贝解释的渐近分析:深入研究复杂性分析
  11. Google IO 2018开发者大会:Android P
  12. C++读书笔记:多态
  13. 电信怎么关闭信息接受服务器,怎么关闭短信接收功能
  14. 结对编程java实现四则运算(张铭 吴昊)
  15. 【可见光室内定位】(一)概览
  16. zblogphp 广告联盟_天兴工作室:广告位大全插件(网站各种广告位集合效果)
  17. 648. 单词替换 : 字典树的经典运用
  18. 企业如何构建数字化平台战略,加速规模化创新
  19. 9.条件语句(if语句)
  20. 第十四章 使用SQL Shell界面(三)

热门文章

  1. java 语法_Java基础语法
  2. Python默认参数
  3. 设置html按钮点击事件无效果,css怎么设置按钮不能点击?
  4. 请写出3个Android布局,一起撸一波干货集中营练练手Android(三)布局+实现篇
  5. swift 去json空格_数字货币为什么要去中心化?好处是什么?
  6. fakeapp2.2.0下载_软件下载 | SuperCuger 测量平差系统 V1.0
  7. putc函数_C语言中的putc()函数与示例
  8. Java RandomAccessFile writeShort()方法与示例
  9. spearman相关性_Spearman的相关性及其在机器学习中的意义
  10. eclipse打开文件所在目录