spring加強:spring aop expression支援多個表示式配置
阿新 • • 發佈:2018-12-21
spring aop expression支援多個表示式配置
準備:
目標類UcUserFilesService 及目標方法insert()方法、update()方法及delete()方法(紅色標註的是目標方法)
package com.huajin.userserver.service; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.huajin.baymax.exception.BayMaxBaseException; import com.huajin.common.dto.GlobalDto; import com.huajin.exchange.domain.PageData; import com.huajin.exchange.responsecode.UserServerResponseCode; import com.huajin.exchange.userservice.domain.response.FileInfo; import com.huajin.exchange.userservice.domain.response.UcUser; import com.huajin.exchange.userservice.domain.response.UcUserFiles; import com.huajin.exchange.utils.ParamMapUtil; import com.huajin.exchange.utils.UUIDUtil; import com.huajin.userserver.datasupport.UcUserFilesDataSupportService; import com.huajin.userserver.service.ucuser.UcUserService; /** * UcUserFilesService * * @author auto-generator * 2015-06-30 26:13:38 */ @Service public class UcUserFilesService { @Autowired private UcUserFilesDataSupportService ucUserFilesDataSupportService; @Autowired private SysParamService sysParamService; @Autowired private UcUserService ucUserService; public UcUserFiles getById(GlobalDto globalDto, Integer id) { return ucUserFilesDataSupportService.getById(globalDto, id); } public FileInfo getByUUID(GlobalDto globalDto,String userFileGuid) { UcUserFiles ucUserFiles = ucUserFilesDataSupportService.getByUUID(globalDto, userFileGuid); if (Objects.isNull(ucUserFiles)) { throw new BayMaxBaseException(UserServerResponseCode.USER_NOT_EXIST, null); } FileInfo fileInfo = new FileInfo(); fileInfo.setFilePath(getFilePath(ucUserFiles.getUserId())); fileInfo.setIsOpen(0); fileInfo.setOwerUserId(ucUserFiles.getUserId()); UcUser ucUser = ucUserService.getSimpleById(globalDto, ucUserFiles.getUserId()); fileInfo.setOwerMemberId(ucUser.getOwnerUserId()); fileInfo.setStatus(ucUser.getUserStatus()); return fileInfo; } private String getFilePath(int userId) { return sysParamService.userFilePath() + userId + File.separator; } public PageData<UcUserFiles> select(GlobalDto globalDto, Map<String, Object> map) { List<UcUserFiles> list = ucUserFilesDataSupportService.select(globalDto, map); return new PageData<>(ParamMapUtil.getTotalsize(map, list.size()), ParamMapUtil.getTotalpage(map, 1), list); } public Integer insert(GlobalDto globalDto, UcUserFiles o) { o.allFileNamesSplit(this.getFilePath(o.getUserId())); o.setUserFileGuid(UUIDUtil.getUUID()); ucUserFilesDataSupportService.insert(globalDto, o); return o.getId(); } public Integer update(GlobalDto globalDto, UcUserFiles o) { o.allFileNamesSplit(this.getFilePath(o.getUserId())); ucUserFilesDataSupportService.update(globalDto, o); return o.getId(); } public void delete(GlobalDto globalDto, Integer id) { ucUserFilesDataSupportService.delete(globalDto, id); } /** * 不分頁查詢列表記錄 * * @param globalDto * @param map * @return * @author hongwei.lian * @date 2018年11月13日 下午12:01:23 */ public List<UcUserFiles> findByCondition(GlobalDto globalDto, Map<String, Object> map) { return ucUserFilesDataSupportService.select(globalDto, map); } /** * 根據使用者Id和檔案型別fileType查詢附件記錄 * * @param userId * @param fileType * @return * @author hongwei.lian * @date 2018年11月13日 下午12:01:38 */ public UcUserFiles getUserFileByUserIdAndFileType(Integer userId, Integer fileType) { Map<String, Object> param = new HashMap<>(2); param.put("userId", userId); param.put("fileType", fileType); List<UcUserFiles> list = this.findByCondition(null, param); return CollectionUtils.isEmpty(list) ? null : list.get(0); } }
方案一:JavaConfig方式配置
切面、切點及前置通知UserFileChangeRecordAspect
package com.huajin.userserver.aop; import java.util.Objects; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.huajin.exchange.enums.user.UserFileTypeDesc; import com.huajin.exchange.userservice.domain.response.UcUserFiles; import com.huajin.userserver.enums.UserFileOperateEnum; import com.huajin.userserver.service.RedisService; import com.huajin.userserver.service.UcUserFilesService; import com.huajin.userserver.utils.CacheKey; import lombok.extern.slf4j.Slf4j; /** * 使用者檔案操作記錄切面 * * @author hongwei.lian * @date 2018年11月12日 下午7:23:08 */ @Aspect @Component("userFileChangeRecordAspect") @Slf4j public class UserFileChangeRecordAspect { @Autowired private UcUserFilesService ucUserFilesService; @Autowired private RedisService redisService; /** * 使用者檔案操作切點 * * @author hongwei.lian * @date 2018年11月13日 下午1:59:26 */ @Pointcut("execution(* com.huajin.userserver.service.UcUserFilesService.insert(..)) || " + "execution(* com.huajin.userserver.service.UcUserFilesService.update(..)) || " + "execution(* com.huajin.userserver.service.UcUserFilesService.delete(..))") public void pointCut() {} /** * 使用者檔案操作記錄 * * @param point * @param returnValue * @author hongwei.lian * @date 2018年11月12日 下午7:24:30 */ @Before("pointCut()") public void userFileOperatorRecord(JoinPoint joinPoint) { try { //-- 1、獲取目標方法名稱和目標方法引數資訊,獲取舊檔案記錄 UcUserFiles olducUserFiles = null; Integer userId = null; Integer fileType = null; String methodName = joinPoint.getSignature().getName(); if (Objects.equals(methodName, UserFileOperateEnum.DELETE.getDesc())) { Integer id = (Integer) joinPoint.getArgs()[1]; olducUserFiles = ucUserFilesService.getById(null, id); if (Objects.nonNull(olducUserFiles)) { userId = olducUserFiles.getUserId(); fileType = olducUserFiles.getFileType(); } } else { UcUserFiles ucUserFiles = (UcUserFiles) joinPoint.getArgs()[1]; if (Objects.nonNull(ucUserFiles)) { userId = ucUserFiles.getUserId(); fileType = ucUserFiles.getFileType(); } olducUserFiles = ucUserFilesService.getUserFileByUserIdAndFileType(userId, fileType); } //-- 組裝使用者檔案快取key String userInfoKey = ""; if (Objects.equals(fileType, UserFileTypeDesc.入會申請書.value)) { userInfoKey = CacheKey.REDISCACHEKEY_USERFILE_APPLYMEMBERSHIP + userId; } else if (Objects.equals(fileType, UserFileTypeDesc.經辦人身份證.value)) { userInfoKey = CacheKey.REDISCACHEKEY_USERFILE_OPERATORCARD + userId; } else if (Objects.equals(fileType, UserFileTypeDesc.機構營業執照.value)) { userInfoKey = CacheKey.REDISCACHEKEY_USERFILE_BUSINESSLICENSE + userId; } else if (Objects.equals(fileType, UserFileTypeDesc.法定代表人身份證.value)) { userInfoKey = CacheKey.REDISCACHEKEY_USERFILE_REPRESENTATIVECARD + userId; } //-- 3、判斷快取中是否存在這個key,不存在則新增 boolean nonStringKey = redisService.nonStringKey(userInfoKey); if (nonStringKey) { redisService.setStringKey(userInfoKey, Objects.isNull(olducUserFiles) ? "" : olducUserFiles.allFileNames()); } } catch (Exception e) { log.error("", e); } } }
從上面的JavaConfig配置可以看出spring aop expression是支援多個表示式配置的,中間可以使用邏輯運算子,支援的有and、or、也可以使用||、&&、!。需要注意一點使用and或者or注意大小寫,儘量都寫作小寫,原因還需要深究。
方案二:XML方式配置
spring-aop.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd " default-lazy-init="true"> <aop:config> <!-- 切面 --> <aop:aspect ref="userFileChangeRecordAspect"> <!-- 切點 --> <aop:pointcut id="pointCut" expression=" execution(* com.huajin.userserver.service.UcUserFilesService.insert(..)) or execution(* com.huajin.userserver.service.UcUserFilesService.update(..)) or execution(* com.huajin.userserver.service.UcUserFilesService.delete(..))"/> <!-- 通知 --> <aop:before pointcut-ref="pointCut" method="userFileOperatorRecord"/> </aop:aspect> </aop:config> </beans>
相應的userFileChangeRecordAspect的userFileOperatorRecord方法邏輯和上面JavaConfig方式的方法邏輯是一樣的,不再贅述
參考文章: