1. 程式人生 > >spring加強:spring aop expression支援多個表示式配置

spring加強:spring aop expression支援多個表示式配置

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方式的方法邏輯是一樣的,不再贅述

參考文章: