创意视觉网站,济南网站建设招标,下沙做网站的公司,合肥搭建网站面向切面的编程#xff08;AOP#xff09;就是让哥们写代码的时候更加关注核心业务的实现#xff0c;将核心业务代码前后的日志等不重要的通过注解的方式#xff0c;交给其他部分完成#xff0c;使得代码有更高的可维护性。
具体使用
先定义一个注解
Target(ElementTyp… 面向切面的编程AOP就是让哥们写代码的时候更加关注核心业务的实现将核心业务代码前后的日志等不重要的通过注解的方式交给其他部分完成使得代码有更高的可维护性。
具体使用
先定义一个注解
Target(ElementType.METHOD)
Retention(RetentionPolicy.RUNTIME)
public interface AutoFill {//数据库操作类型update,insertOperationType value();}
其中OperationType是枚举类可以取两个值update,insert;target表示该注解作用于方法上Retention(RetentionPolicy.RUNTIME)表示该注解会在运行时保留因此可以通过反射机制来读取注解信息。
定义切点 Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill))public void autoFillPointCut(){}
autoFillPointCut()切点表示所有位于com.sky.mapper下被AutoFill的标识方法是可以被切入即目标。
具体方法
Before(autoFillPointCut())public void autoFill(JoinPoint joinPoint) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {log.info(开始进行公共字段自动填充);//获取到当前被拦截的方法上的数据库操作类型MethodSignature signature (MethodSignature) joinPoint.getSignature();AutoFill autoFill signature.getMethod().getAnnotation(AutoFill.class);OperationType operationType autoFill.value();//获得数据操作类型//获取当前被拦截的方法的参数--实体对象Object[] args joinPoint.getArgs();if(args null || args.length 0) {return;}Object entity args[0];//准备赋值的数据LocalDateTime now LocalDateTime.now();Long currentId BaseContext.getCurrentId();//根据当前不同的操作类型为对应的属性通过反射赋值if(operationType OperationType.INSERT) {Method setCreateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setCreateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);setCreateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);}else if(operationType OperationType.UPDATE) {Method setUpdateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);}}
该方法中的before表示是在切点执行下面定义的方法下述代码完成了业务代码执行前的赋值动作。
目标对象 AutoFill(value OperationType.INSERT)Insert(insert into employee (name,username,password,phone,sex,id_number,create_time,update_time,create_user,update_user,status) values (#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status}))void insert(Employee employee);在执行insert方法前会先执行AutoFill方法.