1.自定义注解
2.编写 AOP
3.测试

1.自定义注解

  1. package com.base.yun.spring.aop;
  2.  
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.ElementType;
  5. import java.lang.annotation.Retention;
  6. import java.lang.annotation.RetentionPolicy;
  7. import java.lang.annotation.Target;
  8.  
  9. /**
  10. * 说明:
  11. * 定义日志注解
  12. */
  13. @Target(ElementType.METHOD)
  14. @Retention(RetentionPolicy.RUNTIME)
  15. @Documented
  16. public @interface FileLog {
  17.  
  18. String value() default "记录日志";
  19.  
  20. }

2.编写 AOP

  1. package com.base.yun.spring.aop;
  2.  
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.ProceedingJoinPoint;
  5. import org.aspectj.lang.annotation.After;
  6. import org.aspectj.lang.annotation.AfterReturning;
  7. import org.aspectj.lang.annotation.AfterThrowing;
  8. import org.aspectj.lang.annotation.Around;
  9. import org.aspectj.lang.annotation.Aspect;
  10. import org.aspectj.lang.annotation.Before;
  11. import org.springframework.stereotype.Component;
  12.  
  13. /**
  14. * 说明: 日志的切面处理程序
  15. */
  16. @Aspect
  17. @Component
  18. public class LogAspect {
  19.  
  20. @Before("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
  21. public void doAccessCheck(JoinPoint jp, FileLog fileLog) {
  22. System.out.println("前置通知-->>");
  23. }
  24.  
  25. @After("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
  26. public void doAfterReturning(JoinPoint jp, FileLog fileLog) {
  27. System.out.println("后置通知-->>");
  28. }
  29.  
  30. @Around("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
  31. public Object doAround(ProceedingJoinPoint pJoinPoint, FileLog fileLog) throws Throwable {
  32. System.out.println("环绕通知开始");
  33. // 这里如果pJoinPoint.proceed()不执行,后面拦截到的方法都不会执行,非常适用于权限管理
  34. Object result = pJoinPoint.proceed();
  35. System.out.println("环绕通知结束");
  36. return result;
  37. }
  38.  
  39. @AfterReturning("within(com.base.yun.spring.service.*) && @annotation(fileLog)")
  40. public void addSuccessLog(JoinPoint jp, FileLog fileLog) {
  41. Object[] parames = jp.getArgs();
  42. // 获取目标方法体参数
  43. String className = jp.getTarget().getClass().toString();
  44. // 获取目标类名
  45. String signature = jp.getSignature().toString();
  46. // 获取目标方法签名
  47. String methodName = signature.substring(signature.lastIndexOf(".") + 1,
  48. signature.indexOf("("));
  49. // 获取注解值
  50. String desc = fileLog.value();
  51. // 把调用的信息写到日常记录信息里面去...
  52. System.out.println("最终通知注解值:"+desc);
  53. }
  54.  
  55. // 标注该方法体为异常通知,当目标方法出现异常时,执行该方法体
  56. @AfterThrowing(pointcut = "within(com.base.yun.spring.service.*) && @annotation(fileLog)", throwing = "e")
  57. public void addExceptionLog(JoinPoint jp, FileLog fileLog, Exception e) {
  58. System.out.println("异常通知-->");
  59. // 把错误信息写到错误日志文件里面去...
  60. }
  61. }

3.测试

  1. <aop:aspectj-autoproxy/>
  2. <bean class="com.base.yun.spring.aop.LogAspect"/>
  3. <bean id="purchaseService" class="com.base.yun.spring.service.PurchaseService" />
  1. package spring;
  2.  
  3. import org.junit.Test;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6.  
  7. import com.base.yun.spring.service.PurchaseService;
  8.  
  9. public class AopTest {
  10.  
  11. @Test
  12. public void testAop() {
  13. ApplicationContext ctx = new ClassPathXmlApplicationContext("user.xml");
  14. PurchaseService service = ctx.getBean("purchaseService",PurchaseService.class);
  15. service.purchaseProduct("电风扇", 98, "日用品");
  16. }
  17.  
  18. }

测试结果:

  1. 环绕通知开始
  2. 前置通知-->>
  3. 购买商品。。。
  4. 环绕通知结束
  5. 后置通知-->>
  6. 最终通知注解值:记录日志

AOP 实现自定义注解的更多相关文章

  1. spring AOP 和自定义注解进行身份验证

    一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...

  2. Spring Boot系列——AOP配自定义注解的最佳实践

    AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面. ...

  3. 用AOP拦截自定义注解并获取注解属性与上下文参数(基于Springboot框架)

    目录 自定义注解 定义切面 获取上下文信息JoinPoint ProceedingJoinPoint 定义测试方法 测试结果 小结 AOP可以用于日志的设计,这样话就少不了要获取上下文的信息,博主在设 ...

  4. 【spring boot】SpringBoot初学(6)– aop与自定义注解

    前言 github: https://github.com/vergilyn/SpringBootDemo 一.AOP 官方demo:https://github.com/spring-project ...

  5. 使用AOP获取自定义注解的内容

    目录结构: 一:自定义注解 package org.example.annotation; import java.lang.annotation.ElementType; import java.l ...

  6. springboot通过AOP和自定义注解实现权限校验

    自定义注解 PermissionCheck: package com.mgdd.sys.annotation; import java.lang.annotation.*; /** * @author ...

  7. SpringBoot框架:通过AOP和自定义注解完成druid连接池的动态数据源切换(三)

    一.引入依赖 引入数据库连接池的依赖--druid和面向切面编程的依赖--aop,如下所示: <!-- druid --> <dependency> <groupId&g ...

  8. 基于SpringBoot 、AOP与自定义注解转义字典值

    一直以来,前端展示字典一般以中文展示为主,若在表中存字典值中文,当字典表更改字典值对应的中文,会造成数据不一致,为此设置冗余字段并非最优方案,若由前端自己写死转义,不够灵活,若在业务代码转义,臃肿也不 ...

  9. 利用Spring AOP和自定义注解实现日志功能

    Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...

随机推荐

  1. 流水的新技术,铁打的Linux

    关注嘉为科技,获取运维新知 这一年人工智能火了,凡是带电的专业都往AI上靠,实在靠不上的还可以看AlphaGo下棋,探讨AI能否取代人类.这种全民跟风,比前两年的“云计算”.“大数据”热度还高.就算你 ...

  2. Pytorch半精度浮点型网络训练问题

    用Pytorch1.0进行半精度浮点型网络训练需要注意下问题: 1.网络要在GPU上跑,模型和输入样本数据都要cuda().half() 2.模型参数转换为half型,不必索引到每层,直接model. ...

  3. LoveIsIntheAir模板换背景

    /*simplememory*/#google_ad_c1, #google_ad_c2 {display:none;}.LoveIsIntheAir a, .LoveIsIntheAirdiv, . ...

  4. 漏洞复现——bash远程解析命令执行漏洞

    漏洞描述:Bash脚本在解析某些特殊字符串时出现逻辑错误导致可以执行后面的命令,在一些cgi脚本中,数据是通过环境变量来传递的,这样就会形成该漏洞 漏洞原理:bash通过以函数名作为环境变量名,以“( ...

  5. .NET 高效开发之不可错过的实用工具(第一的当然是ReSharper插件)

    工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节 ...

  6. MapReduce(三)

    MapReduce(三) MapReduce(三): 1.关于倒叙排序前10名 1)TreeMap根据key排序 2)TreeSet排序,传入一个对象,排序按照类中的compareTo方法排序 2.写 ...

  7. Hadoop---Java-API对HDFS的操作

    Java-API对HDFS的操作 哈哈哈哈,深夜来一波干货哦!!! Java-PAI对hdfs的操作,首先我们建一个maven项目,我主要说,我们可以通过Java代码来对HDFS的具体信息的打印,然后 ...

  8. jetty隐藏版本号教程

    一.查看版本号 直接访问端口不像apache/tomcat/nginx会直接有版本号 但实际查看返回http头时还是带着版本号 二.隐藏版本号操作 编缉$JETTY_HOME/start.ini将je ...

  9. Latex常用数学符号(转)

    http://blog.sina.com.cn/s/blog_642075770100u0np.html Latex常用数学符号(转) 1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根 ...

  10. day18-python的正则表达式

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...