1、开启对spring AspectJ风格切面的支持
2、扫描注解的bean
3、声明切面@Aspect
4、声明切入点@Pointcut(value="",argNames="")
5、声明通知@Before @After @AfterReturning @AfterThrowing @Around
@Before 前置通知 目标方法运行前织入
@After 后置通知 目标方法后织入
@AfterReturning 后置返回通知 目标方法返回后织入
@AfterThrowing 后置异常通知 目标方法抛出异常后织入
@Around 环绕通知 目标方法运行前后及异常抛出后织入
<!-- 开启Spring对标注了@Aspect注解bean的支持 默认是不支持@AspectJ风格的切面 统一使用CGLIB代理(spring默认是JDK的动态代理,若没有实现接口则会开启CGLIB) 使用CGLIB,它有一个使用限制,即无法在使用final修饰的bean上应用横切关注点 因为代理需要对Java类进行继承,一旦使用了关键字final,这将是无法做到的--> <aop:aspectj-autoproxy proxy-target-class="true" />
<!-- 自动扫描注解的bean--> <context:component-scan base-package="com.xxx.xxx"> <context:include-filter type="annotation" expression="com.alibaba.dubbo.config.annotation.Service" /> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect" /> </context:component-scan>
@Aspect @Slf4j public class Aspect { /** * 声明切入点,此方法无内容,返回类型必须是void */ @Pointcut("execution(* com.xxx.xxx.*.service..*.*(..))") public void pointCut() { } /** * 声明环绕通知 * @param pjp 连接点 通过连接点实例来获得方法执行的上下文信息 * @return * @throws Throwable */ @Around(value = "pointCut()") public Object transferException(ProceedingJoinPoint pjp) throws Throwable { // 方法返回值 Class<?> methodReturnType = ((MethodSignature) pjp.getSignature()).getMethod().getReturnType(); Object result = null; try { result = pjp.proceed();//Proceed with the next advice or target method invocation } catch (Exception e) { log.error("exception occurred.............."); if (methodReturnType.isAssignableFrom(Response.class)) { String errorCode = null; String errorMsg = null; if (e instanceof ApplicationException) { errorCode = ((ApplicationException) e).getCode(); errorMsg = ((ApplicationException) e).getErrorMessage(); } else { errorCode = BussErrorCode.ERROR_CODE_999999.getErrorcode(); errorCode = BussErrorCode.ERROR_CODE_999999.getErrordesc(); } result = new Response<Object>(errorCode, errorMsg); } } return result; } }
时间: 2024-10-12 21:19:05