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,然后这样使用即可