自己编写的使用起来很爽的SpringAOP组件

1.spring-aop.xml

<aop:aspectj-autoproxy proxy-target-class="true"/> 
	<bean id="aopRegist" class="com.heping.community.common.spring.aop.core.AopRegist"></bean>

2.AopRegist类

@Aspect
public class AopRegist{
	@Around("@annotation(aopManager)")
	public Object around(ProceedingJoinPoint joinPoint,AopManager aopManager) throws Throwable{
		
		Object result = null;
		if (aopManager == null){
			result = joinPoint.proceed();
		} else {
			Signature signature = joinPoint.getSignature();
	        MethodSignature methodSignature = null;
	        if (!(signature instanceof MethodSignature)) {
	            throw new WebException(ErrorConsts.AOP_ERROR[0], ErrorConsts.AOP_ERROR[1]);//抛出一个自定义异常
	        }
	        methodSignature = (MethodSignature) signature;
	        Object classObject = joinPoint.getTarget();
	        
	        Method currentMethod = classObject.getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
	        Object[] args = joinPoint.getArgs();
	        Class<? extends AopDriver> aopDriver = aopManager.value();
			AopDriver driver = aopDriver.newInstance();
			
			args = driver.before(currentMethod, args, classObject);
			
			result = joinPoint.proceed(args);
			
			result = driver.after(result, currentMethod, args, classObject);
		}

		return result;
	}
	
	
}

3.AopManager注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AopManager {
	Class <? extends AopDriver> value();
}

4.AopDriver接口

public interface AopDriver {
	/**
	 * 方法之前执行
	 * @param method 方法
	 * @param params 参数
	 * @param classObject 当前类
	 * @return 返回的是参数,你可以在这里修改参数.
	 * @throws Throwable
	 */
	Object[]  before(Method method, Object[] params, Object classObject) throws Throwable;
	 /**
	  * 方法执行之后执行
	  * @param returnObject 返回值
	  * @param method 方法
	  * @param params 参数
	  * @param classObject 当前类
	  * @return 返回的就是返回值Object returnObject,你可以在这里修改返回值
	  * @throws Throwable
	  */
	Object after(Object returnObject, Method method, Object[] params, Object classObject) throws Throwable;
}

5.测试,新建一个打印日志的aop类,实现AopDriver

public class AopLogDriver implements AopDriver{
	private static Logger log = Logger.getLogger(AopLogDriver.class);

	@Override
	public Object[] before(Method method, Object[] params, Object classObject) throws Throwable {
		log.info("before");
		return params;
	}

	@Override
	public Object after(Object returnObject, Method method, Object[] params, Object classObject) throws Throwable {
		log.info("after");
		
		
		return returnObject;
	}
	

}

下面直接在service层方法使用

@Service
public class ActivityServiceImpl implements ActivityService{
	
	@Resource
	private ActivityMapper activityMapper;
	
	@Override
	@AopManager(AopLogDriver.class)
	public void listActivitysByActivityInfoDto(PageBean pageBean, ActivityInfoDto activityInfoDto) {
		List<ActivityInfoDto> activityInfoDtos = activityMapper.listActivitysByActivityInfoDto(activityInfoDto);
		pageBean.setRows(activityInfoDtos);		
	}

没问题.

如果需要添加其他功能的aop驱动,直接实现AopDriver,然后这样使用即可


猜你喜欢

转载自blog.csdn.net/dmw412724/article/details/80512775