AOP切面用于系统日志
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切面用于系统日志的更多相关文章
- spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller
示例1:通过包路径及类名规则为应用增加切面 该示例是通过拦截所有com.dxz.web.aop包下的以Controller结尾的所有类的所有方法,在方法执行前后打印和记录日志到数据库. 新建一个spr ...
- Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId
一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...
- 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入
首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html http://www.cnblogs.com/guokai8 ...
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
- Spring AOP 切面编程记录日志和接口执行时间
最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...
- Springboot项目使用aop切面保存详细日志到ELK日志平台
上一篇讲过了将Springboot项目中logback日志插入到ELK日志平台,它只是个示例.这一篇来看一下实际使用中,我们应该怎样通过aop切面,拦截所有请求日志插入到ELK日志系统.同时,由于往往 ...
- AOP切面通知
需要用的基本的jar包: aopalliance-1.0.jaraspectj-1.6.8.jaraspectjweaver-1.6.8.jarcommons-logging-1.1.3.jarspr ...
- springboot-实现log4j的AOP切面
参考链接: https://www.cnblogs.com/liaojie970/p/7883687.html https://blog.csdn.net/autfish/article/detail ...
随机推荐
- float元素一定要闭合
float:left; float:right; 一定要两个元素一起放float
- 10.php引用(&)详解及注意事项
<?php function &test() { static $b=0;//申明一个静态变量 $b=$b+1; echo $b; return $b; } $a=test();//这条 ...
- 更新设置api
8.8 更新设置 API Elasticsearch允许在elasticsearch.yml文件中指定各种参数来调优.但你应该把这个文件当做 默认设置,可以在运行时通过Elasticsearch RE ...
- table width 决定 td width
w td width 有无在chrome edge ff 均未影响td实际宽度,td接近等比分配table width. <!doctype html> <html lang=&qu ...
- JS取得不同连接的地址,并打开新窗口
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...
- shell脚本读取文件+读取命令行参数+读取标准输入+变量赋值+输出到文件
读取url_list文件批量下载网页 url_list http://www.tianyancha.com/company/2412078287 http://www.4399.com/special ...
- Pycharm如何修改背景图(BackgroundColor)
Outline 之前见到别人Eclipse自定义设置了背景图,在想 Pycharm是不是也可以设置?都是IDE嘛~ 没事捣鼓 Pycharm Settings 时,看到“Background Imag ...
- Java中Collections和Collection的区别
java.util.Collection Collection 层次结构 中的根接口.Collection 表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许 ...
- 修改hostname不重启机器并生效
1.依次执行: vi /etc/sysconfig/network 这种修改方式不会马上生效,需要重启服务器后生效,所以继续执行下面命令 echo ***(例如:node13 ...
- shell相关知识
在bash shell中,$( )与` ` (反引号)都是用来做命令替换用(command substitution)的.所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:*完成引号 ...