<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
package com.itemfile.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.bson.Document;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.core.query.UpdateDefinition;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Aspect
@Component
@Slf4j
public class MongoTemplateAspect {
/**
* 第一个 * :表示返回任意类型的值
* 第二个 update* :表示 update开头的方法
* 第三个 (..) :表示任何入参
* "execution(* org.springframework.data.mongodb.core.MongoTemplate.update*(..))"
*/
@Pointcut("execution(* org.springframework.data.mongodb.core.MongoTemplate.update*(..))")
public void point() {
}
/**
* 因为 MongoTemplate的update的所有方法参数都是固定的
* 第一个是 Query
* 第二个是 UpdateDefinition
* 最后一个是 mongodb的集合名称
* @param jp
*/
@Before(value = "point()")
public void doBefor(JoinPoint jp) {
try {
Object[] args = jp.getArgs();
if (null == args && args.length == 0) {
return;
}
int length = args.length;
Object lastArg = args[length - 1];
boolean flag = false;
if (lastArg instanceof String && "online_product".equals(lastArg)) {
flag = true;
} else if (lastArg instanceof Class &&
"com.michaels.ifr.bean.OnlineProductEx".equals(((Class<?>) lastArg).getName())) {
flag = true;
}
if (flag) {
appendUpdateTime(args);
}
}catch (Exception e){
log.error("point MongoTemplate happend exception ",e);
}
}
public void appendUpdateTime(Object[] args) {
for (Object arg : args) {
Update updateObject = null;
if (arg instanceof UpdateDefinition &&
((updateObject = (Update) arg).getUpdateObject()).containsKey("$set")) {
Document document = new Document();
document.put("update_time", LocalDateTime.now());
updateObject.set("update_time", LocalDateTime.now());
return;
}
}
log.info("MongoTemplate {}", args);
}
}