自定义注解通过aop实现操作日志管理

通过自定义注解,然后在控制层方法上加上此注解,通过aop切面拦截到该方法,获取注解值,实现操作日志管理。

1 自定义注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LoggerAnnonation {
    String op();
}

2  编写切面(在普通类获取request可用使用RequestContextHolder .getCurrentRequestAttributes())

import com.yc.entity.Logger;
import com.yc.entity.User;
import com.yc.service.LoggerService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author an-ping
 * @date 2019/3/30
 */
@Aspect
@Component
public class LoggerAspectj {

    @Pointcut("execution(* com.yc.controllers..*(..))")
    public void pointcut(){}
    @Resource(name="loggerServiceImpl")
    LoggerService loggerService;

    @After(value = "pointcut()")
    public void after(JoinPoint pjp) throws Throwable{
       String methodName= pjp.getSignature().getName();

        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();

        //String str = (String) requestAttributes.getAttribute("name", RequestAttributes.SCOPE_SESSION);

        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
        User user=(User)request.getSession().getAttribute("user");

        String  ip=request.getRemoteAddr();  //获取ip
        String op="";
       if(ip.equals("0:0:0:0:0:0:0:1")){
           ip="127.0.0.1";
       }
      // System.out.println(ip);
        if(user!=null){
            MethodSignature ms=null;
            ms=(MethodSignature)pjp.getSignature();
            Class[] argType=ms.getMethod().getParameterTypes();
            Method method=pjp.getTarget().getClass().getMethod(methodName,argType);
            if (method.isAnnotationPresent(LoggerAnnonation.class)) {
                LoggerAnnonation loggerAnnonation=method.getAnnotation(LoggerAnnonation.class);
                 op=loggerAnnonation.op();
              //  System.out.println(op+"操作日志");

                SimpleDateFormat  sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String time=sdf.format(new Date());
                Logger logger=new Logger();
                logger.setIp(ip);
                logger.setOp(op);
                logger.setTime(time);
                loggerService.add(logger);
            }
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,我们可以使用自定义注解实现AOP(面向切面编程)。AOP是一种编程范型,它允许开发者在程序运行时动态地将代码切入到已有代码的特定位置。 下面是一个简单的示例,演示如何使用自定义注解实现AOP。 首先,我们需要定义一个自定义注解: ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Loggable { } ``` 这个注解用来标记需要记录日志的方法。它的@Target注解指定了它只能用于方法上,@Retention注解指定了它的生命周期是运行时。 接下来,我们创建一个切面类,用来实现AOP的逻辑: ``` @Aspect @Component public class LoggingAspect { @Before("@annotation(com.example.Loggable)") public void logMethodCall(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("Method " + methodName + " called"); } } ``` 这个类使用Spring AOP框架提供的@Aspect注解来标记它是一个切面类。它的@Before注解指定了它要在被@Loggable注解标记的方法之前执行。JoinPoint参数包含了被拦截的方法的信息,我们可以从中获取方法名等信息。 最后,在需要记录日志的方法上加上@Loggable注解即可: ``` @Component public class MyService { @Loggable public void doSomething() { // do something } } ``` 当doSomething()方法被调用时,LoggingAspect中的logMethodCall()方法会被执行,记录方法调用信息。 这就是使用自定义注解实现AOP的基本步骤。当然,实际应用中会更加复杂,需要更多的切面逻辑和注解参数等。但是这个简单的示例可以帮助你理解如何使用自定义注解实现AOP

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值