首先,先敲一个注解类
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>
完毕,功能已经 实现, 如果哪个地方有不足,欢迎评论区讨论。毕竟我还是个初学者