Spring框架基于AOP实现简单日志管理步骤解析

 更新时间:2020年06月17日 14:30:27   作者:卧城听风雨  
这篇文章主要介绍了Spring框架基于AOP实现简单日志管理步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

SPringAOP的使用

技术概述,描述这个技术是做什么?学习该技术的原因,技术的难点在哪里。
为了实现项目管理员端的操作数据库日志,便于方便所以利用Spring框架的AOP机制进行实现,项目的难点在于如果设置切入点,如何获取参数。

技术详述,描述你是如何实现和使用该技术的,要求配合代码和流程图详细描述。可以再细分多个点,分开描述各个部分。

在applicationContext.xml中开启AOP代理

<aop:aspectj-autoproxy />

自定义一个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnno {
	String operatorType();
}

编写一个切面类

@Component
@Aspect
public class LogAopAspect {
	@Autowired
	LogtableService logtableService;//Logtable为数据库中的一张表,用于存储日志信息
	@Around("@annotation(qj.admin.aspect.LogAnno)")//设定需要捕获的标签
	public Object around(ProceedingJoinPoint pjp) throws Throwable
	{
		MethodSignature methodSignature =(MethodSignature)pjp.getSignature();
		Method method = methodSignature.getMethod();
		String targetName = pjp.getTarget().getClass().getName(); 
		System.out.println("增强的类是:"+targetName);
		System.out.println("增强的方法是:"+method.getName());
		Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), method.getParameterTypes());
		LogAnno logAnno = realMethod.getAnnotation(LogAnno.class);//获取注解的方法上的自定义标签类
		String operatortype = logAnno.operatorType();//获取到自定义标签上的注解如“修改账户状态”
		//String operatortype = "修改用户积分";
		AdminLog adminLog = new AdminLog();
		adminLog.setOperatortype(operatortype);
		adminLog.setOperator("123");
		Object resultObject = null;
		Object [] parameter = pjp.getArgs();//获取注解的方法的传入参数
		try {
			resultObject = pjp.proceed();
			adminLog.setOperatorresult("正常 "+Arrays.toString(parameter));
		} catch (Exception e) {
			// TODO: handle exception
			adminLog.setOperatorresult("失败");
		}
		finally {
			adminLog.setOperatordate(new Date());
			logtableService.addLog(adminLog);
		}
		return resultObject;
	}

用自定义注解注解一个方法

@LogAnno(operatorType = "修改账户状态")
	public void handleUser(int IDNumber, int type) {
		User user = userDAO.get(IDNumber);
		userDAO.update(user, type);
	}

项目目录结构

技术使用中遇到的问题和解决过程。要求问题的描述和解决有一定的内容,不能草草概括。要让遇到相关问题的人看了你的博客之后能够解决该问题。

刚刚开始的时候时候仅仅利用Method method = methodSignature.getMethod();来获取当前增强的方法,但是在接下来的LogAnno logAnno = method.getAnnotation(LogAnno.class);中get到的logAnno类为空,而上面通过打印System.out.println("增强的方法是:"+method.getName());显示增加的方法并没有错误,导致这就陷入了我的知识盲区,经过查找资料,大部分教程都说在自定义注解类中添加@Retention(RetentionPolicy.RUNTIME)即可解决问题,但是我添加之后还是同样的问题,最后意识到,可能这方法所获取的函数是两个不同的函数,最后又经过查找最终发现原来是这个aop拦截的是ServiceImpl的一个方法,然后这个ServiceImpl又启动了事务管理,而事务管理又是基于AOP的。

也就是说,这个权限的@Around的切面拦截的是个代理对象的方法,而代理对象的方法是不会把原来父类中的方法的注解加上去的,所以这里这个注解的对象为null。

最后运用Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), method.getParameterTypes());获取到了真正需要的增强的函数。

总结

利用Spring的AOP机制确实能够大大减少代码量,很容易的就实现了日志的管理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Hikari 数据库连接池内部源码实现的小细节

    Hikari 数据库连接池内部源码实现的小细节

    这篇文章主要介绍了Hikari 数据库连接池内部源码实现的小细节,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解Java如何实现企业微信审批流程

    详解Java如何实现企业微信审批流程

    这篇文章主要使用了一个Java示例代码,来向大家展示如何在企业微信中实现审批流程,文中的示例代码简洁易懂,有需要的小伙伴可以参考下
    2024-11-11
  • Spring中自定义拦截器的使用

    Spring中自定义拦截器的使用

    大家好,本篇文章主要讲的是Spring中自定义拦截器的使用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • IntelliJ IDEA安装插件阿里巴巴Java开发手册(Alibaba Java Coding Guidelines)

    IntelliJ IDEA安装插件阿里巴巴Java开发手册(Alibaba Java Coding Guidelines

    这篇文章主要介绍了IntelliJ IDEA安装插件阿里巴巴Java开发手册(Alibaba Java Coding Guidelines),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • java检查服务器的连通两种方法代码分享

    java检查服务器的连通两种方法代码分享

    这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 深入聊一聊springboot项目全局异常处理那些事儿

    深入聊一聊springboot项目全局异常处理那些事儿

    最近在做项目时需要对异常进行全局统一处理,所以下面这篇文章主要给大家介绍了关于springboot项目全局异常处理那些事儿,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • SpringBoot+URule实现可视化规则引擎的方法示例

    SpringBoot+URule实现可视化规则引擎的方法示例

    规则引擎其实是一种组件,它可以嵌入到程序当中,将程序复杂的判断规则从业务代码中剥离出来,使得程序只需要关心自己的业务,而不需要去进行复杂的逻辑判断,本文给大家介绍了SpringBoot+URule实现可视化规则引擎的方法示例,需要的朋友可以参考下
    2024-12-12
  • JAVA--HashMap热门面试题

    JAVA--HashMap热门面试题

    这篇文章主要介绍了JAVA关于HashMap容易被提问的面试题,文中题目提问频率高,相信对你的面试有一定帮助,想要入职JAVA的朋友可以了解下
    2020-06-06
  • Flink结合Kafka实现通用流式数据处理

    Flink结合Kafka实现通用流式数据处理

    这篇文章将和大家一起深入探讨Flink和Kafka的关系以及它们在数据流处理中的应用,并提供一些最佳实践和实际案例,希望对大家有一定的帮助
    2025-03-03
  • Java基于Graphics2D实现海报制作

    Java基于Graphics2D实现海报制作

    这篇文章主要为大家详细介绍了Java如何基于Graphics2D实现海报制作,并且支持自定义颜色,背景,logo,贴图,感兴趣的小伙伴可以了解一下
    2024-04-04

最新评论