达成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 + "
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())
已完成,功能已完成 实现, 如果有任何不足,请在评论区讨论。毕竟,我还是个初学者
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123




