import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component; import java.io.PrintStream;
import java.util.Arrays; /**
* @Author : guoyanan
* @Title : 配置切面类,用于记录系统日志
* @Time : 2019/03/15 15:29
* @Document :
*/
@Aspect
@Component
public class SystemLogs { /**
* 配置切点方法
* 方便统一管理切点
* execution属性为切点需要管理的包路径
* 规则:
* execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
* 规则解释:
* modifiers-pattern?:修饰符匹配,也就是关键字匹配例如:public、private、protect;*代表所有
* ret-type-pattern:返回值匹配,可以是java基础类型也可以是自义定类,例如:基础类:String、List等,自定义类:UserInfo、OrderInfo等
* eclaring-type-pattern?:类路径匹配,切面需要管理的包路径,可以精确到类。也可以包下所有类,例如:com.test.*
* name-pattern:方法名匹配,根据方法名建立切点,例如:setName、set*等;set*表示所有以set开头的方法
* param-pattern:参数名匹配,根据方法的参数类型建立切点,参数使用“,”隔开使用*标识参数可以是任意类型,如果是(..)说明不限制参数个数
* throws-pattern?:异常类型匹配,可以根据异常类型匹配切点。例如:NullPointException、IOException等
* 注意:
* 带有?的说明是可以省略的类型
* 举例:
* execution(public String com.config.SystemTest.HelloWord(String)) IOException
* 这个语句的含义:匹配com.config.路径下SystemTest类中方法名为HelloWord且参数为一个String类型返回类型也是String的IOException异常的一个切点。
* 测试throws-pattern?:加与不加,没有明显的异常。可以认为是不需要的规则。
*/
@Pointcut("execution(public String com.busi.config.SystemTest.HelloWord(String)) IOException")
public void HelloWord(){} /**
* 引用切点HelloWord
* 打印切点进入前的参数和访问的类
* 访问切点前执行方法
* @param point
*/
@Before("HelloWord()")
private void before(JoinPoint point){ System.out.println("@Before:模拟权限检查..."); System.out.println("@Before:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); System.out.println("@Before:参数为:" + Arrays.toString(point.getArgs())); System.out.println("@Before:被织入的目标对象为:" + point.getTarget()); } /**
* 访问切点执行后运行此方法
* @param point
* @param returnValue
*/
@AfterReturning(pointcut="HelloWord()",returning="returnValue")
private void afterReturning(JoinPoint point,Object returnValue){
System.out.println("@AfterReturning:模拟日志记录功能..."); System.out.println("@AfterReturning:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); System.out.println("@AfterReturning:参数为:" + Arrays.toString(point.getArgs())); System.out.println("@AfterReturning:返回值为:" + returnValue); System.out.println("@AfterReturning:被织入的目标对象为:" + point.getTarget());
} /**
* 访问切点方法后运行方法,与@AfterReturning的区别是缺少了returning属性
* 认为:@AfterReturning是@After的升级
* @param point
*/
@After("HelloWord()")
public void after(JoinPoint point) { System.out.println("@After:模拟释放资源..."); System.out.println("@After:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); System.out.println("@After:参数为:" + Arrays.toString(point.getArgs())); System.out.println("@After:被织入的目标对象为:" + point.getTarget()); } /**
* 执行后发生异常方法,可以用于捕捉执行过程中的异常
* @param jp
* @param e
*/
@AfterThrowing(pointcut = "HelloWord()",throwing="e")
public void doException(JoinPoint jp,Throwable e){
if(e!=null){
PrintStream printStream=System.err;
printStream.println(); }
} }

切点方法:

/**
* @Author : guoyanan
* @Title : 切点测试方法
* @Time : 2019/03/15 15:22
* @Document :
*/
@RestController
public class SystemTest { @RequestMapping("/hello")
public String HelloWord(@RequestParam("na") String name)throws NullPointerException{
String str = null;
try {
str.toUpperCase();
}catch (NullPointerException e){ } return "Hello Word"+name;
} @RequestMapping("/word")
public String Word(@RequestParam("na") String name){ String str = null;
str.toUpperCase(); return "Word"+name;
}
}

执行结果打印:

@Before:模拟权限检查...
@Before:目标方法为:com.busi.config.SystemTest.HelloWord
@Before:参数为:[1]
@Before:被织入的目标对象为:com.busi.config.SystemTest@17933314
@After:模拟释放资源...
@After:目标方法为:com.busi.config.SystemTest.HelloWord
@After:参数为:[1]
@After:被织入的目标对象为:com.busi.config.SystemTest@17933314
@AfterReturning:模拟日志记录功能...
@AfterReturning:目标方法为:com.busi.config.SystemTest.HelloWord
@AfterReturning:参数为:[1]
@AfterReturning:返回值为:Hello Word1
@AfterReturning:被织入的目标对象为:com.busi.config.SystemTest@17933314

AOP切面用于系统日志的更多相关文章

  1. spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller

    示例1:通过包路径及类名规则为应用增加切面 该示例是通过拦截所有com.dxz.web.aop包下的以Controller结尾的所有类的所有方法,在方法执行前后打印和记录日志到数据库. 新建一个spr ...

  2. Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId

    一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...

  3. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  4. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  5. Spring Boot 2.0 教程 | AOP 切面统一打印请求日志

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...

  6. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  7. Springboot项目使用aop切面保存详细日志到ELK日志平台

    上一篇讲过了将Springboot项目中logback日志插入到ELK日志平台,它只是个示例.这一篇来看一下实际使用中,我们应该怎样通过aop切面,拦截所有请求日志插入到ELK日志系统.同时,由于往往 ...

  8. AOP切面通知

    需要用的基本的jar包: aopalliance-1.0.jaraspectj-1.6.8.jaraspectjweaver-1.6.8.jarcommons-logging-1.1.3.jarspr ...

  9. springboot-实现log4j的AOP切面

    参考链接: https://www.cnblogs.com/liaojie970/p/7883687.html https://blog.csdn.net/autfish/article/detail ...

随机推荐

  1. 烂笔头-Spring3

    1.spring相关jar包的导入 2.配置文件bean.xml <?xml version="1.0" encoding="UTF-8"?> &l ...

  2. Intellij IDEA Ultimate Edition 14.1 破解

    key:IDEA value:61156-YRN2M-5MNCN-NZ8D2-7B4EW-U12L4 (2) key:huangwei value:97493-G3A41-0SO24-W57LI-Y2 ...

  3. mysqld.sock

    sudo  service mysql start https://dev.mysql.com/doc/refman/5.7/en/problems-with-mysql-sock.html B.5. ...

  4. win8 内置管理员账号既能使用metro应用又能使用默认共享

    一.内置管理员账号打开METRO应用 1.按WIN+R 弹出运行框. 2.输入gpedit.msc点确定,打开本地组策略编辑器. 3.逐级选择"计算机配置","Windo ...

  5. 假设做一个精美的Login界面(攻克了一EditText自带clear的功能,相似iphone的UITextField)

    先上图:     XML为: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  6. pc端用微信扫一扫实现微信第三方登陆

    官方文档链接 第一步:获取AppID  AppSecret (微信开发平台申请PC端微信登陆)   第二步:生成扫描二维码,获取code https://open.weixin.qq.com/conn ...

  7. JS 中的substring ,substr ,slice,split,join

    substr with different arguments passed in: str.substring(startNum,stopNum ); str.slice(startNum,stop ...

  8. LCT(link cut tree) 动态树

    模板参考:https://blog.csdn.net/saramanda/article/details/55253627 综合各位大大博客后整理的模板: #include<iostream&g ...

  9. DP专题·三(01背包+完全背包)

    1.hdu 2126 Buy the souvenirs 题意:给出若干个纪念品的价格,求在能购买的纪念品的数目最大的情况下的购买方案. 思路:01背包+记录方案. #include<iostr ...

  10. PAT 天梯赛 L1-001 【水】

    L1-001. Hello World 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 这道超级简单的题目没有任何输入. 你只需要在一行中输 ...