Spring AOP实现简单的日志功能
时间:2022-06-23
本文章向大家介绍Spring AOP实现简单的日志功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
AOP对代码的侵入性非常的小,是一种可插拔的思想,大大降低了耦合度,AOP在许多地方都有应用,这篇文章就看看使用AOP实现日志的功能,也算是AOP思想的一种体现了。
主要是在用户访问一个URL前,记录用户的ip,访问方式,访问的URL,访问的哪个方法以及该方法的参数,访问URL后,记录访问返回的结果。
整个项目基于Spring Boot构建。
首先建立一个实体类Man,对应数据库中的一个表
@Entity
public class Man {
// 主键、自增
@Id
@GeneratedValue
private Integer id;
private String name;
private Integer age;
// 省略get/set方法
}
使用jpa实现基本的CRUD(没搞service,直接在controller里干了,凑合着看~)
@RestController
@RequestMapping("/man")
public class ManController {
@Autowired
private ManDao manDao;
@Autowired
private ManService manService;
private Logger logger = LoggerFactory.getLogger(ManController.class);
/**
* 添加一条记录
* @param man 结果集合
* @Validated 注解
* @return
*/
@GetMapping("/insertMan")
public Man insertOne(@Validated Man man, BindingResult br) {
man.setName(man.getName());
man.setAge(man.getAge());
return manDao.save(man);
}
/**
* 获取所有记录
* @return
*/
@GetMapping("/manList")
public List<Man> getList() {
logger.info("getList");
return manDao.findAll();
}
/**
* 根据id查询一条记录
* @param id
* @return
*/
@GetMapping("/man/{id}")
public Man getOne(@PathVariable("id") Integer id) {
return manDao.findOne(id);
}
/**
* 更新指定的一条记录
* @param id
* @param name
* @param age
* @return
*/
@GetMapping("/updateMan/{id}")
public Man updateOne(@PathVariable("id") Integer id, @RequestParam("name") String name,
@RequestParam("age") Integer age) {
Man man = new Man();
man.setId(id);
man.setName(name);
man.setAge(age);
return manDao.save(man);
}
@RequestMapping("/deleteMan/{id}")
public void deleteOne(@PathVariable("id") Integer id) {
manDao.delete(id);
}
@RequestMapping("/insertTwo")
public void insertTwo() {
manService.insertTwo();
}
}
使用AOP实现日志功能
/**
* @Component 该注解表示把类加入spring容器
* @Aspect 该注解表示切面
* @author liu
*/
@Component
@Aspect
public class Log {
private Logger logger = LoggerFactory.getLogger(Log.class);
/**
* 定义一个公共切点,代码复用
* 拦截com.codeliu.controller.ManController类下面的所有public方法
*/
@Pointcut(value = "execution(public * com.codeliu.controller.ManController.*(..))")
private void log() {}
/**
* 方法执行前切入
*/
@Before(value = "log()")
public void before(JoinPoint joinPoint) {
ServletRequestAttributes sa = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = sa.getRequest();
// 获取用户访问的url
logger.info("url={}", request.getRequestURL());
// 获取用户访问的方式,get/post
logger.info("method={}", request.getMethod());
// 获取的ip
logger.info("ip={}", request.getRemoteAddr());
// 获取用户访问的是哪个方法
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
// 获取方法的参数
logger.info("args={}", joinPoint.getArgs());
}
@After(value = "log()")
public void after() {
logger.info("记录操作后");
}
/**
* 打印返回的内容
* @param object
*/
@AfterReturning(value = "log()", returning = "object")
public void afterReturn(Object object) {
logger.info("object={}", object);
}
}
切点是ManController 下面的所有public方法,在执行方法前,记录访问的URL等信息,方法返回后,记录返回的结果(@AfterReturning注解的returning 属性)。
试着访问一下getList方法获取数据库所有记录
可以看看控制台的输出
这样使用aop就实现了一个简单的日志功能。
- linux下mysql函数的详细案列
- Java集合深度解析之Hashtable
- linux 下mysql的安装,并设置必要的密码
- golang使用protobuf
- hdu 3518 (后缀数组)
- hdu ----3695 Computer Virus on Planet Pandora (ac自动机)
- 编程之美----NIM游戏
- hdu----1686 Oulipo (ac自动机)
- C++ GPU && CPU
- MyCat安装与测试教程 超详细!
- 关于如何来构造一个String类
- Java集合深度解析之LinkedList
- 2015编程之美(资格赛)--基站选址
- CentOS7下Nginx服务器安装与使用教程
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Laravel 集成微信用户登录和绑定的实现
- PHP实现微信对账单处理
- Laravel5.1框架路由分组用法实例分析
- PHP的HTTP客户端Guzzle简单使用方法分析
- laravel 框架实现无限级分类的方法示例
- 详解Laravel5.6通过路由进行API版本控制的简单方法
- php+layui数据表格实现数据分页渲染代码
- thinkPHP框架乐观锁和悲观锁实例分析
- PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
- laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
- Laravel框架实现即点即改功能的方法分析
- PHP使用PDO实现mysql防注入功能详解
- laravel接管Dingo-api和默认的错误处理方式
- PHP接入微信H5支付的方法示例
- PHP中用Trait封装单例模式的实现