使用aop管理日志

使用aop管理日志

创建实体类User.java

package com.zr.aop.pojo;

public class User {
    private String id;
    private String userName;
    private Integer age;

    public User(String id, String userName, Integer age) {
        this.id = id;
        this.userName = userName;
        this.age = age;
    }

    public User() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }
}

创建UserService.java及其实现类UserServiceImpl.java

package com.zr.aop.service;

import com.zr.aop.pojo.User;

public interface UserService {
    void printUser(User user);
}
package com.zr.aop.service.impl;

import com.zr.aop.anno.Log;
import com.zr.aop.pojo.User;
import com.zr.aop.service.UserService;
import org.springframework.stereotype.Service;

import java.util.Objects;

@Service
public class UserServiceImpl implements UserService {
    @Override
    @Log(OperateType = "print",OperateName = "打印...")
    public void printUser(User user) {
        if(Objects.isNull(user)){
            throw new RuntimeException("不能为空哟...");
        }
        System.out.println("用户ID:"+user.getId()+",用户名:"+user.getUserName()+",用户年龄:"+user.getAge());
    }
}

自定义注解Log.class

package com.zr.aop.anno;


import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    public String OperateType() default "";
    public String OperateName() default "";
}

创建AOP

package com.zr.aop.aop;

import com.zr.aop.anno.Log;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
public class MyAspect {
    @Pointcut("execution(* com.zr.aop.service.impl.UserServiceImpl.printUser(..))")
    public  void pointCut(){

    }

    @Before("pointCut()")
    public void before(JoinPoint joinPoint) throws Exception{

        String clzName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        Class<?> clz = Class.forName(clzName);
        Method[] methods = clz.getMethods();
        for(Method method:methods){
            if(method.getName().equals(methodName)){
                String operateType = method.getAnnotation(Log.class).OperateType();
                String operateName = method.getAnnotation(Log.class).OperateName();
                System.out.println(operateName+":::"+operateType);
            }
        }
        System.out.println(clzName+":"+methodName+":"+args[0].toString());
    }

    @After("pointCut()")
    public void after(JoinPoint joinPoint){
        System.out.println("方法执行结束.....");
    }

    @Around("pointCut()")
    public void around(ProceedingJoinPoint joinPoint){
        System.out.println("环绕通知开始====================");
        long start = System.currentTimeMillis();
        try {
            joinPoint.proceed();
            long end = System.currentTimeMillis();
            System.out.println("环绕通知结束================"+(end-start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    @AfterThrowing(pointcut = "pointCut()",throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint,Throwable e){
        String clzName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        System.out.println("出现异常了,类:"+clzName+",方法:"+methodName);
    }

}

测试

@Test
public  void test(){
    User user = new User("1","david",27);
    userService.printUser(user);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值