java aop日志记录_AOP实现日志记录功能

场景:整个系统的DML操作需要记录日志

记录内容:1 操作人 2 操作时间 3 操作类型(登录 新增 修改 删除) 4 操作描述  5 详细请求数据(varchar2()) 6 操作IP  ==>日志表

实现:

原来方式:在每个方法的里面编写记录日志代码;

缺点:代码重复 ,与原有逻辑耦合度高。

0b76602f4f9e08cd53263fbdb0b4ad5e.png

AOP: 将日志记录功能提取到切面中。动态切入到需要日志记录的方法上即可;

优点: 解耦合,代码复用。

1) 先写一个日志切面LogAspect.java;

//日志切面

@Component//对象由spring管理

@Aspect//切面注解

public classLogAspect {//定义切入点,切入到添加了LogData注解的方法上

@Pointcut("@annotation(aop.LogData)")public voidpointCut(){}/**

* 记录日志的切面方法

* 在该方法中定义统一的日志记录逻辑

* @param joinPoint*/@Before("pointCut()")public voidlog(JoinPoint joinPoint){

System.out.println("进入日志Aspect");

}

}

2)写一个日志信息LogData.java;

//自定义日志注解

@Target({ElementType.METHOD})//指定作用的目标对象(可以添加的位置)

@Retention(RetentionPolicy.RUNTIME)//指定在运行期间起作用

public@interface LogData {//定义注解中的属性

String description() default "";//日志类型

intlogType();

}

3)在控制层方法上写上注解,加上描述信息,描述日志;

@LogData(logType = 1,description = "学生信息修改")

@RequestMapping("/update")publicString update(Integer id,ModelMap modelMap){//查询用户信息,展示到页面

Student student=studentService.findById(id);

modelMap.put("student",student);return "update.jsp";

}

要想起作用,还要在springmvc.xml配置文件中配置AOP注解;

二、自定义注解

枚举:jdk1.5之后存在的一种数据类型。用来定义有限个对象。 enum

语法:

Public enum 类名{

对象定义;

类的成员定义

}

调用: 类名.对象名 获取枚举对象。

1)创建一个LogType.java文件来写枚举;

/**

* 日志枚举类型

* 枚举是一个特殊的类

* class 可以创建n个对象

* 枚举类型的对象是固定的*/

public enumLogType {//创建枚举对象,对象的个数是有限的,对象与对象之间用逗号隔开

LOGIN(1),DELETE(2),UPDATE(3),INSERT(4);//可以定义任意的方法和属性,与普通类类似

private final inttype;//构造方法

LogType(inttype) {this.type =type;

}public intgetType() {returntype;

}

}

2)日志的注解也需要改变为枚举类型的,在LogData.java文件中;

/**

* 自定义注解*/@Target({ElementType.METHOD,ElementType.FIELD})//指定作用的目标对象(可以添加的位置)

@Retention(RetentionPolicy.RUNTIME)public@interface LogData {//定义注解中的属性

String description() default "";//日志类型 1、登录 2、删除 3、修改 4、插入

LogType logType();

}

3)调用日志对象,在控制层中;

@LogData(logType = LogType.DELETE,description = "学生信息删除")

@RequestMapping("/delete")publicString delete(Integer id){

studentService.delete(id);return "redirect:list";

}

@LogData(logType= LogType.UPDATE,description = "学生信息修改")

@RequestMapping("/update2")publicString update2(Integer id,ModelMap modelMap){

Student student=studentService.selectById(id);

modelMap.put("student",student);return "update.jsp";

}

@LogData(logType= LogType.INSERT,description = "学生信息新增")

@RequestMapping("/insert")publicString insert(Student student){

studentService.insert(student);return "redirect:list";

}

4)写LogAspect.java文件;

@Component//对象由spring管理

@Aspect//切面注解

public classLogAspect {private static final Logger LOGGER = LogManager.getLogger(LogAspect.class);//定义切入点,切入到添加了LogData注解的方法上

@Pointcut("@annotation(aop.LogData)")public voidpointCut(){

}/**

* 记录日志的切面方法

* 在该方法中定义统一的日志记录逻辑

* @param joinPoint*/@Before("pointCut()")public voidlog(JoinPoint joinPoint){

System.out.println("进入日志Aspect");//获取到方法签名

MethodSignature signature=(MethodSignature) joinPoint.getSignature();//获取到连接点方法对象

Method method=signature.getMethod();//获取方法上面特定的注解

LogData annotation=method.getAnnotation(LogData.class);

LogType logType=annotation.logType();

String description=annotation.description();

LOGGER.info("获取到注解内容:logType="+logType.getType()+",description:"+description);//aop中获取request

ServletRequestAttributes requestAttributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request=requestAttributes.getRequest();

HttpSession session=request.getSession();//获取操作人

Student student= (Student) session.getAttribute("student");//获取请求数据

Map parameterMap=request.getParameterMap();//将对象转换成json字符串==>存储到请求数据字段中//jackSon json字符串操作

ObjectMapper objectMapper=newObjectMapper();try{

String s=objectMapper.writeValueAsString(parameterMap);

LOGGER.info("请求数据:"+s);

}catch(JsonProcessingException e) {

e.printStackTrace();

}//todo 将日志信息保存到数据库 LogController service mapper jsp

}

}

三、枚举

枚举可用于switch语句中

public classT {public static voidmain(String[] args) {

test(LogType.DELETE);//获取到枚举对象

LogType logType =LogType.DELETE;//获取到对象之后,与普通对象操作方式一样

int type =logType.getType();

}/**

* 枚举类型在switch中的使用

* @param logType*/

public static voidtest(LogType logType) {switch(logType){caseLOGIN:

System.out.println("登录操作");break;caseDELETE:

System.out.println("删除操作");break;caseINSERT:

System.out.println("插入操作");break;caseUPDATE:

System.out.println("修改操作");break;

}

}

}

四、枚举还是实现单例模式的最佳方式

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP是一个强大的框架,可以帮助我们实现各种切面,其中包括日志记录。下面是实现日志记录的步骤: 1. 添加Spring AOP依赖 在Maven或Gradle中添加Spring AOP依赖。 2. 创建日志切面 创建一个用于记录日志的切面。这个切面可以拦截所有需要记录日志的方法。在这个切面中,我们需要使用@Aspect注解来声明这是一个切面,并使用@Pointcut注解来定义哪些方法需要被拦截。 ```java @Aspect @Component public class LoggingAspect { @Pointcut("execution(* com.example.demo.service.*.*(..))") public void serviceMethods() {} @Around("serviceMethods()") public Object logServiceMethods(ProceedingJoinPoint joinPoint) throws Throwable { // 获取方法名,参数列表等信息 String methodName = joinPoint.getSignature().getName(); Object[] args = joinPoint.getArgs(); // 记录日志 System.out.println("Method " + methodName + " is called with args " + Arrays.toString(args)); // 执行方法 Object result = joinPoint.proceed(); // 记录返回值 System.out.println("Method " + methodName + " returns " + result); return result; } } ``` 在上面的代码中,我们使用了@Around注解来定义一个环绕通知,它会在拦截的方法执行前后执行。在方法执行前,我们记录了该方法的名称和参数列表,然后在方法执行后记录了该方法的返回值。 3. 配置AOP 在Spring的配置文件中配置AOP。首先,我们需要启用AOP: ```xml <aop:aspectj-autoproxy/> ``` 然后,我们需要将创建的日志切面添加到AOP中: ```xml <bean id="loggingAspect" class="com.example.demo.aspect.LoggingAspect"/> <aop:config> <aop:aspect ref="loggingAspect"> <aop:pointcut id="serviceMethods" expression="execution(* com.example.demo.service.*.*(..))"/> <aop:around method="logServiceMethods" pointcut-ref="serviceMethods"/> </aop:aspect> </aop:config> ``` 在上面的代码中,我们将创建的日志切面声明为一个bean,并将其添加到AOP中。我们还定义了一个切入点,并将其与日志切面的方法进行关联。 4. 测试 现在,我们可以测试我们的日志记录功能了。在我们的业务逻辑中,所有匹配切入点的方法都会被拦截,并记录它们的输入和输出。我们可以在控制台中看到这些日志信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值