达成AOP注解(用户注册成功后,添加数据库一条log数据记录注册时间)

原创
小哥 3年前 (2022-11-16) 阅读数 7 #大杂烩

首先,键入注释类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/* @Target(ElementType.METHOD) 
 * 用于描述方法
 */
@Target(ElementType.METHOD)
/* RetentionPolicy.RUNTIME 
 * 注解会在class存在于字节码文件中,在运行时,它可以通过反射获得。
 */
@Retention(RetentionPolicy.RUNTIME) 

public @interface LoginLog {
    String value() default "";
}

第二步,我们service的实现类Imp中切入

@LoginLog
    public boolean checkPassword(String userId, String password) {
        User user = userDao.findById(userId);
        if (null != user && user.getPassword().equals(password)) {
            return true;
        }
        return false;
    }

我们切入后,我们必须写Aspect切面完成 代码增强

@Aspect
@Component
public class LogAspect {

    @Autowired
    private AopLogDao logDao;

    @Pointcut("@annotation(com.neusoft.demo.annotation.LoginLog)")
    public void pointcut() {
    }

    // 前置通知,方法在执行前执行。
    @Before("pointcut()")
    public void BeforeMethod(JoinPoint jp) {
        String methodName = jp.getSignature().getName();
        Object[] args = jp.getArgs();
        System.out.println("BeforeMethod  The method   " + methodName + "   parameter is  " + Arrays.asList(args));
        String className = jp.getTarget().getClass().getName();
        System.out.println("包名:" + className);
    }

    // 后置通知,方法在执行后执行。(无论是否发生异常)
    @After("pointcut()")
    public void AfterMethod(JoinPoint jp) {
        String methodName = jp.getSignature().getName();
        Object[] args = jp.getArgs();
        System.out.println("AfterMethod  The method    " + methodName + "   parameter is  " + Arrays.asList(args));
        System.out.println();
    }

    // 返回通知,方法在正常执行后执行。
    @AfterReturning(value = "pointcut()", returning = "result")
    public void AfterReturningMethod(JoinPoint jp, Boolean result) {
        String methodName = jp.getSignature().getName();
        Object[] args = jp.getArgs();
        AopLog aopLog = new AopLog();
//      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss");
//      String dateLog = sdf.format(date);
        System.out.println("AfterReturningMethod  The method is  " + methodName + "

parameter is "

  • Arrays.asList(args) + " Result is " + result); if (result) { aopLog.setUserName((args[0]).toString()); User logUserId = userDao.findByName(aopLog.getUserName()); logDao.aopLog(logUserId.getUserId()); System.out.println("登录信息插入完成!"); } else { System.out.println("登录信息插入失败"); }

    }
    
    // 异常通知,在方法引发异常后执行。
    @AfterThrowing(value = "pointcut()", throwing = "e")
    public void AfterThrowingMethod(JoinPoint jp, Exception e) {
        String methodName = jp.getSignature().getName();
        System.out.println("AfterThrowingMethod  The method   " + methodName + "exception :" + e);
    }

更新下(2020/8/31 8:51): 以前没有Dao层代码和xml
Dao:

@Mapper
public interface AopLogDao {
    void aopLog(@Param("userId") String userId);
}

XML:




    
        
        
        
        
    
    
        INSERT INTO t_log
        (user_id,register_datetime)
        VALUES
        (#{userId}, NOW())
    

已完成,功能已完成 实现, 如果有任何不足,请在评论区讨论。毕竟,我还是个初学者

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除