spring boot 使用spring AOP实现数据操作公共属性的填充

1、添加依赖


<dependency>  
    <groupId>org.springframework.bootgroupId>  
    <artifactId>spring-boot-starter-aopartifactId>  
dependency>  

2、新建切面类,设置controller里面的add、update方法为切点

@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

3、配置前置通知

@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;
    }

5、测试

在add、update操作中实体的创建时间、更新时间、创建人、更新人可以正常赋值

你可能感兴趣的:(spring-boot)