首先是几个概念:连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、切面(Aspect)

另外也要使用到注解。

需求:通过注解定义LogEnable。然后程序运行能够识别定义了LogEnable注解的方法记录日志。

1.定义注解

package cn.duanjt.util;

import java.lang.annotation.*;

/**
* 记录日志的注解类
* @author 段江涛
* @date 2018-11-08
*/
@Target(ElementType.METHOD)//表示用于标识方法
@Retention(RetentionPolicy.RUNTIME)//表示运行时保留
public @interface LogEnable {
/**
* 主要是标志日志的描述信息
* @return
*/
String note() default "";
}

2.定义需要监听的类和方法

package cn.duanjt.service;

import org.springframework.stereotype.Service;

import cn.duanjt.Pojo.Student;
import cn.duanjt.util.LogEnable; @Service
public class StudentService {
//定义注解,然后描述当前方法的作用
@LogEnable(note="获取学生信息")
public Student getStudent(int id) {
if (id == 0) {
throw new RuntimeException("编码不能为0");
}
Student stu = new Student();
stu.setId(id);
stu.setName("zhangsan");
stu.setAddr("重庆");
return stu;
} //未定义注解,将不会被监听
public int getId(int id) {
return id + 1;
}
}

3.定义切面,记录日志

package cn.duanjt.util;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; @Aspect
@Component
public class LogHelper {
// 没有单独定义切点,直接在环绕方法里面处理[包cn.duanjt.service下面的所有类下面的所有方法,同时包含LogEnable注解的将被监听]
@Around("execution(* cn.duanjt.service.*.*(..)) && @annotation(LogEnable)")
public Object around(ProceedingJoinPoint point) {
MethodSignature signature = (MethodSignature) point.getSignature();
long time = System.currentTimeMillis(); //记录开始时间
String className = point.getTarget().getClass().getName(); // 类名
String method = className + "." + signature.getName(); //方法名
Object[] args = point.getArgs(); // 参数 LogEnable logEnable= signature.getMethod().getAnnotation(LogEnable.class);
String logNote=logEnable.note(); //日志信息
try {
Object result = point.proceed();
System.out.println("方法名:" + method);
System.out.println("参数:" + StringUtils.join(args));
System.out.println("返回值:" + result.toString());
System.out.println("日志功能:" + logNote);
System.out.println("耗时:" + (System.currentTimeMillis() - time) + "毫秒");
System.out.println("-----------------------");
return result;
} catch (Exception e) {
System.out.println("方法名1:" + method);
System.out.println("参数:" + StringUtils.join(args));
System.out.println("日志功能:" + logNote);
System.out.println("异常信息:" + e.getMessage());
System.out.println("耗时:" + (System.currentTimeMillis() - time) + "毫秒");
System.out.println("-----------------------");
return null;
} catch (Throwable e) {
return null;
} }
}

4.在主程序上要加上注解@EnableAspectJAutoProxy。我这里使用的是springboot,如下:

package cn.duanjt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy; @SpringBootApplication
@ComponentScan("cn.duanjt")
@EnableAspectJAutoProxy //表示启用AOP
public class ServerDemoApplication { public static void main(String[] args) {
SpringApplication.run(ServerDemoApplication.class, args);
}
}

最后,运行结果如下:

方法名:cn.duanjt.service.StudentService.getStudent
参数:
返回值:Student [id=, name=zhangsan, addr=重庆]
日志功能:获取学生信息
耗时:毫秒
-----------------------

注意:

1. @EnableAspectJAutoProxy用于开启全局的AOP

2. LogHelper类上面的@Aspect和@Component是必须的,前者用于标注是切面,后者用于将对象注入到spring容器

3. 切面表达式@Around("execution(* cn.duanjt.service.*.*(..)) && @annotation(LogEnable)").一定需要execution。详细的可以下去再了解

spring aop通过注解实现日志记录的更多相关文章

  1. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  2. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  3. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  4. 运用Spring Aop,一个注解实现日志记录

    运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...

  5. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  6. Spring Boot 2.X(八):Spring AOP 实现简单的日志切面

    AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ...

  7. spring aop 使用注解方式总结

    spring aop的注解方式:和xml的配置方式略有区别,详细如下: 1.首先还是建立需要的切面类:切面类里面定义好切点配置,以及所有的需要实现的通知方法. /** * */ package com ...

  8. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

  9. Spring AOP使用注解记录用户操作日志

    最后一个方法:核心的日志记录方法 package com.migu.cm.aspect; import com.alibaba.fastjson.JSON; import com.migu.cm.do ...

随机推荐

  1. plsql developer 10注册码----亲测截止2017年5月6可用

    亲测截止2017年5月6可用 Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca

  2. NPM安装步骤

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  3. 初识 GitHub

    初识 GitHub 一.注册账号 GitHub 官网:https://github.com/ 点击右上角sign up,进行注册,注册界面如下: 填写用户名,邮箱地址,密码,下滑点击绿色按钮:Crea ...

  4. Django使用多数据库

    有些项目可能涉及到使用多个数据库的情况,方法很简单. 1.在settings中设定DATABASE 比如要使用两个数据库: DATABASES = { 'default': { 'NAME': 'ap ...

  5. Spring 学习——Spring常用注解——@Component、@Scope、@Repository、@Service、@Controller、@Required、@Autowired、@Qualifier、@Configuration、@ImportResource、@Value

    Bean管理注解实现 Classpath扫描与组件管理 类的自动检测与注册Bean 类的注解@Component.@Service等作用是将这个实例自动装配到Bean容器中管理 而类似于@Autowi ...

  6. ODAC(V9.5.15) 学习笔记(四)TOraDataSet

    名称 类型 说明 SequenceMode TSequenceMode ODAC可以直接利用Oracle中的序列对象为表的主键赋值,从而实现主键自动增长的功能.该属性决定了在什么场合下使用序列: sm ...

  7. Bootstrap3基础 dropdown divider 下拉列表中的分割线

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  8. upc组队赛1 流连人间的苏苏

    流连人间的苏苏 题目描述 苏苏在做红尘仙的任务时,发现坐落于风景秀丽.四季如春的昆明市的云南中医学院. 没过多久,苏苏就喜欢上了这个学校.以致于苏苏忘了回涂山的时间,现在她只剩下d天的时间待在云南中医 ...

  9. Nodejs学习笔记2

    在linux中, 个人用户的文件, 通常是放在 自己的 家目录中的, root用户放在 /root中. root用户根其他普通用户不同, root用户是专门放在 /root目录中的, 而普通用户的文件 ...

  10. 密码发生器|2012年蓝桥杯B组题解析第八题-fishers

    (10')密码发生器 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如果写在纸上,担心纸张被别人发现 ...