实现AOP注解(用户登陆成功后,插入数据库一条log数据记录登录时间)

首先,先敲一个注解类

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 + "\nparameter is  "
				+ Arrays.asList(args) + "\nResult 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:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.neusoft.demo.dao.AopLogDao">
    <resultMap id="BaseResultMap"
               type="com.neusoft.demo.entity.AopLog">
        <result column="user_id" property="userId"/>
        <result column="user_name" property="userName"/>
        <result column="description" property="description"/>
        <result column="register_datetime" property="datetime"/>
    </resultMap>
    <insert id="aopLog">
		INSERT INTO t_log
		(user_id,register_datetime)
		VALUES
		(#{userId}, NOW())
	</insert>
</mapper>

完毕,功能已经 实现, 如果哪个地方有不足,欢迎评论区讨论。毕竟我还是个初学者

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值