背景數據庫設計過程當中,咱們每每會給數據庫表添加一些通用字段,好比建立人、建立時間、修改人、修改時間,在一些公司的設計過程當中有時會強制要求每一個表都要包含這些基礎信息,以便記錄數據操做時的一些基本日誌記錄。按照日常的操做來講,通用作法是輸寫sql時,將這些信息和對象的基本屬性信息一塊兒寫入數據庫,固然,這也是你們習覺得常的操做,這種寫法無可厚非,可是對於一個高級開發人員來講,若是全部的表都進行如此操做,未免顯得有點囉嗦,並且數據表多的話,這樣寫就有點得不償失了。其實還有一種更簡便的作法,spring框架你們應該是比較熟悉的,幾乎每一個公司都會用到,其中aop思想(切面編程)的經典應用場景之一就是日誌記錄,本文結合aop思想,着重介紹下springboot框架下如何利用切面編程思想實現將建立人、建立時間、更新人、更新時間等基礎信息寫入數據庫。程序員
核心代碼@Aspect @Component @Configuration public class CommonDaoAspect { private static final String creater = "creater"; private static final String createTime = "createTime"; private static final String updater = "updater"; private static final String updateTime = "updateTime"; @Pointcut("execution(* com.xx.xxxx.*.dao.*.update*(..))") public void daoUpdate() { } @Pointcut("execution(* com.xx.xxxx.*.dao.*.insert*(..))") public void daoCreate() { } @Around("daoUpdate()") public Object doDaoUpdate(ProceedingJoinPoint pjp) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes == null) { return pjp.proceed(); } HttpServletRequest request = attributes.getRequest(); String token = request.getHeader("token"); String username = getUserName(); if (token != null && username != null) { Object[] objects = pjp.getArgs(); if (objects != null && objects.length > 0) { for (Object arg : objects) { BeanUtils.setProperty(arg, updater, username); BeanUtils.setProperty(arg, updateTime, new Date()); } } } Object object = pjp.proceed(); return object; } @Around("daoCreate()") public Object doDaoCreate(ProceedingJoinPoint pjp) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes == null) { return pjp.proceed(); } Object[] objects = pjp.getArgs(); if (objects != null && objects.length > 0) { for (Object arg : objects) { String username = getUserName(); if (username != null) { if (StringUtils.isBlank(BeanUtils.getProperty(arg, creater))) { BeanUtils.setProperty(arg, creater, username); } if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) { BeanUtils.setProperty(arg, createTime, new Date()); } } } } Object object = pjp.proceed(); return object; } private String getUserName() { return UserUtils.getUsername(); } }
核心代碼聲明瞭一個CommonDaoAspect切面類,實體類中聲明瞭4個核心方法和一個獲取用戶名信息的方法,UserUtils是項目中聲明的工具類,包含獲取用戶id、姓名等一些基礎信息,你們能夠根據本身的實際狀況去定義,不要照部就搬。4個核心方法中,daoUpdate和daoCreate上添加了@Pointcut註解,該註解經過聲明正則表達式來肯定項目包中dao目錄下哪些方法執行該切面方法。doDaoUpdate和doDaoCreate方法上添加了@Around註解,註解中引入了上述兩個方法,表示環繞通知,在咱們本身dao目錄下的對應文件目標方法完成先後作加強處理。面試
注:execution(* com.xx.xxxx..dao..update*(..)) 表示在dao目錄下的任何文件中的以update開頭的方法正則表達式
execution(* com.xx.xxxx..dao..insert*(..)) 表示在dao目錄下的任何文件中的以insert開頭的方法spring
最近我整理了整套《JAVA核心知識點總結》,說實話 ,做爲一名Java程序員,不論你需不須要面試都應該好好看下這份資料。拿到手老是不虧的~個人很多粉絲也所以拿到騰訊字節快手等公司的Offersql
進【Java進階之路羣】,找管理員獲取哦-!數據庫