<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
@Aspect
@Component
public class WebControllerAop {
private final Logger logger = LoggerFactory
.getLogger(this.getClass());
@Pointcut("execution(* com.cy.example.controller..*.update(..))")
public void updatePointcut(){}
@Pointcut("execution(* com.cy.example.controller..*.add(..))")
public void addPointcut(){}
}
这里说一下@Pointcut表达式的规则,
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?
name-pattern(param-pattern)throws-pattern?)
括号中各个pattern分别表示修饰符匹配(modifier-pattern?)、返回值匹配(ret-type-pattern)、类路径匹配(declaring-type-pattern?)、方法名匹配(name-pattern)、参数匹配((param-pattern))、异常类型匹配(throws-pattern?),其中后面跟着“?”的是可选项。
returning type pattern,name pattern, and parameters pattern是必须的.
ret-type-pattern:可以为*表示任何返回值,全路径的类名等.
name-pattern:指定方法名,代表所以,set,代表以set开头的所有方法.
parameters pattern:指定方法参数(声明的类型),(..)代表所有参数,()代表一个参数,(,String)代表第一个参数为任何值,第二个为String类型.
任意公共方法的执行:
execution(public * *(..))
任何一个名字以 set 开始的方法的执行:
execution(* set*(..))
AccountService 接口定义的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
在 service 包中定义的任意方法的执行:
execution(* com.xyz.service.*.*(..))
在 service 包或其子包中定义的任意方法的执行:
execution(* com.xyz.service..*.*(..))
在 service 包中的任意连接点(在 Spring AOP 中只是方法执行):
within(com.xyz.service.*)
在 service 包或其子包中的任意连接点(在 Spring AOP 中只是方法执行):
within(com.xyz.service..*)
实现 AccountService 接口的代理对象的任意连接点 (在 Spring AOP 中只是方法执行):
this(com.xyz.service.AccountService)
实现 AccountService 接口的目标对象的任意连接点 (在 Spring AOP 中只是方法执行):
target(com.xyz.service.AccountService)
@Before("updatePointcut()")
public void doUpdateBefore(JoinPoint joinPoint){
//获取目标方法的参数信息
Object[] obj = joinPoint.getArgs();
SuperEntity> entity = (SuperEntity>) obj[0];
SysUserEntity user = (SysUserEntity) SecurityUtils.getSubject().getSession()
.getAttribute(WebConfig.LOGIN_USER);
entity.setC_updateDate(DateUtil.getNow());
entity.setN_updater(user.getId());
}
@Before("addPointcut()")
public void doAddBefore(JoinPoint joinPoint){
//获取目标方法的参数信息
Object[] obj = joinPoint.getArgs();
SuperEntity> entity = (SuperEntity>) obj[0];
SysUserEntity user = (SysUserEntity) SecurityUtils.getSubject().getSession()
.getAttribute(WebConfig.LOGIN_USER);
entity.setC_createDate(DateUtil.getNow());
entity.setC_updateDate(DateUtil.getNow());
entity.setN_creater(user.getId());
entity.setN_updater(user.getId());
entity.setN_deleted(0);
}
其中一个controller的示例:
@RequestMapping("/add")
@ResponseBody
public Map<String, Object> add(@ModelAttribute("role") SysRoleEntity role) {
boolean flag = roleService.insert(role);
Map<String, Object> map = new HashMap<String, Object>();
if (flag) {
map.put("flag", flag);
map.put("msg", "添加成功!");
} else {
map.put("flag", flag);
map.put("msg", "添加失败!");
}
return map;
}
@RequestMapping("/update")
@ResponseBody
public Map<String, Object> update(@ModelAttribute("role") SysRoleEntity role) {
boolean flag = roleService.updateById(role);
Map<String, Object> map = new HashMap<String, Object>();
if (flag) {
map.put("flag", flag);
map.put("msg", "更新成功!");
} else {
map.put("flag", flag);
map.put("msg", "更新失败!");
}
return map;
}
在add、update操作中实体的创建时间、更新时间、创建人、更新人可以正常赋值