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