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方式的方法逻辑是一样的,不再赘述

 

参考文章:

http://docs.jboss.org/jbossaop/docs/2.0.0.GA/docs/aspect-framework/reference/en/html/pointcuts.html

https://blog.csdn.net/z_dendy/article/details/9447857

https://blog.csdn.net/u010746364/article/details/53288818

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP配置文件主要有两种方式:基于XML配置和基于注解配置。 基于XML配置的方式需要在Spring配置文件中引入aop的命名空间,并通过<aop:config>元素来定义切面和通知。具体配置如下: 1. 引入aop的命名空间: ```xml xmlns:aop="http://www.springframework.org/schema/aop" ``` 2. 在<aop:config>中定义切面和通知: ```xml <aop:config> <aop:aspect id="myAspect" ref="myAspectBean"> <aop:pointcut expression="execution(* com.example.MyClass.myMethod(..))" id="myPointcut" /> <aop:before method="beforeAdvice" pointcut-ref="myPointcut" /> <aop:after method="afterAdvice" pointcut-ref="myPointcut" /> </aop:aspect> </aop:config> ``` 其中,id为"myAspect"的元素定义了切面,ref属性指定了切面所对应的Bean。expression属性指定了切点表达式,pointcut-ref属性指定了切点,method属性指定了通知方法。 基于注解配置的方式需要在Spring配置文件中开启注解支持,并在切面类上使用相应的注解进行配置。具体配置如下: 1. 开启注解支持: ```xml <context:annotation-config /> <aop:aspectj-autoproxy /> ``` 2. 在切面类上使用注解进行配置: ```java @Aspect @Component public class MyAspect { @Pointcut("execution(* com.example.MyClass.myMethod(..))") public void myPointcut() {} @Before("myPointcut()") public void beforeAdvice() { // 前置通知的逻辑 } @After("myPointcut()") public void afterAdvice() { // 后置通知的逻辑 } } ``` 其中,@Aspect注解标识该类为切面,@Component注解将该类作为Spring的Bean进行管理。@Pointcut注解定义了切点,@Before注解定义了前置通知方法,@After注解定义了后置通知方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值