当前位置: 首页 > news >正文

北京公司网站制作哪家专业安徽省建设安全质量协会网站

北京公司网站制作哪家专业,安徽省建设安全质量协会网站,厦门网站建设开发公司,宁波网站建设信息推荐背景 在很多场景下#xff0c;我们对需要对一些公共字段进行赋值操作#xff0c;如果我们每一个公共字段都进行代码赋值那无疑会增加很多重复无用代码#xff0c;都会导致我们的 代码臃肿#xff0c;所以我们使用AOP切面编程#xff0c;实现功能增强#xff0c;来完成公…背景 在很多场景下我们对需要对一些公共字段进行赋值操作如果我们每一个公共字段都进行代码赋值那无疑会增加很多重复无用代码都会导致我们的 代码臃肿所以我们使用AOP切面编程实现功能增强来完成公共字段自动填充功能 例子 1). 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。 2). 在更新数据时, 将updateTime 设置为当前时间, updateUser设置为当前登录用户ID。 目前,在我们的项目中处理这些字段都是在每一个业务方法中进行赋值操作,如下: 新增员工方法 /*** 新增员工** param employeeDTO*/public void save(EmployeeDTO employeeDTO) {//.......................////设置当前记录的创建时间和修改时间employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());//设置当前记录创建人id和修改人idemployee.setCreateUser(BaseContext.getCurrentId());//目前写个假数据后期修改employee.setUpdateUser(BaseContext.getCurrentId());///employeeMapper.insert(employee);}编辑员工方法 /*** 编辑员工信息** param employeeDTO*/public void update(EmployeeDTO employeeDTO) {//........................................///employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(BaseContext.getCurrentId());///employeeMapper.update(employee);}实现步骤 1). 自定义注解 AutoFill用于标识需要进行公共字段自动填充的方法 2). 自定义切面类 AutoFillAspect统一拦截加入了 AutoFill 注解的方法通过反射为公共字段赋值 3). 在 Mapper 的方法上加入 AutoFill 注解 自定义注解 AutoFill package com.sky.annotation;import com.sky.enumeration.OperationType; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** 自定义注解用于标识某个方法需要进行功能字段自动填充处理*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface AutoFill {//数据库操作类型UPDATE INSERTOperationType value(); }在此之前我们选择将数据库的操作类型进行封装 package com.sky.enumeration;/*** 数据库操作类型*/ public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT }自定义切面 AutoFillAspect package com.sky.aspect;/*** 自定义切面实现公共字段自动填充处理逻辑*/ Aspect Component Slf4j public class AutoFillAspect {/*** 切入点*/Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill))public void autoFillPointCut(){}/*** 前置通知在通知中进行公共字段的赋值*/Before(autoFillPointCut())public void autoFill(JoinPoint joinPoint){/重要//可先进行调试是否能进入该方法 提前在mapper方法添加AutoFill注解log.info(开始进行公共字段自动填充...);} }完善自定义切面 AutoFillAspect 的 autoFill 方法 package com.sky.aspect;import com.sky.annotation.AutoFill; import com.sky.constant.AutoFillConstant; import com.sky.context.BaseContext; import com.sky.enumeration.OperationType; 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.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.time.LocalDateTime;/*** 自定义切面实现公共字段自动填充处理逻辑*/ Aspect Component Slf4j public class AutoFillAspect {/*** 切入点*/Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill))public void autoFillPointCut(){}/*** 前置通知在通知中进行公共字段的赋值*/Before(autoFillPointCut())public void autoFill(JoinPoint joinPoint){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){//为4个公共字段赋值try {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);} catch (Exception e) {e.printStackTrace();}}else if(operationType OperationType.UPDATE){//为2个公共字段赋值try {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);} catch (Exception e) {e.printStackTrace();}}} }在Mapper接口的方法上加入 AutoFill 注解 以CategoryMapper为例分别在新增和修改方法添加AutoFill()注解也需要EmployeeMapper做相同操作 package com.sky.mapper;Mapper public interface CategoryMapper {/*** 插入数据* param category*/Insert(insert into category(type, name, sort, status, create_time, update_time, create_user, update_user) VALUES (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}))AutoFill(value OperationType.INSERT)void insert(Category category);/*** 根据id修改分类* param category*/AutoFill(value OperationType.UPDATE)void update(Category category);}
http://www.hkea.cn/news/14447574/

相关文章:

  • 株洲网站优化找哪家网络服务有点问题
  • 国外网站能否做百科参考资料网页网站作业制作
  • 狠狠做网站歌手投票网站怎么做
  • 新乡营销型网站建设长春seo经理
  • iis 新建网站 要登录网站设计存在的问题
  • 比格设计网站官网博客网站怎么搭建
  • 泰安北京网站建设公司哪家好saas系统多少钱
  • 网站建设服务协议 百度旅行社网页设计
  • 美食网站开发与设计任务书昆明做网站建设技巧公司
  • 东莞莞城网站建设公司南京seo优化推广
  • 视频网站如何赚钱江门公司网站建设
  • 网站站长要会什么用大连网站建设-中国互联
  • 开封网站建设网络开发工具有哪些
  • 帮人负责做网站叫什么工作深圳办公室设计
  • wordpress快速仿站开发龙岗网站建设
  • 网站开发时如何兼容俄语好网站设计
  • 网站建设摊销方法论述电子商务网站的建设
  • 哈尔滨网络科技公司做网站购物网站开发教程视频
  • 网站前端开发流程班级网站做哪些方面
  • 网站管理功能图vps建wordpress
  • 石家庄制作网站的公司没有版权的图片网站
  • 网站推广有哪些举措医院客户做网站找谁
  • 天津市哪里有做网站的网站建设 专项资金变更
  • 怎么做网站封面上的图网页制作与网站开发从入门到精通 豆瓣
  • 聚成网站建设应用商店oppo版本下载
  • 个人网站做app上传中国十大网络科技公司
  • 国家森林公园网站建设网站icp备案网址
  • 百度 搜索到手机网站社交网站建站
  • 弄淘宝招牌图什么网站可以做中国建设银行天津分行网站
  • 建立网站的数据表电子线路板东莞网站建设