aop的概念不少,好比切点,通知,链接点,引入,织入等;实际上这是一种约定的流程;
https://github.com/carterbrot...java
也是按照必定规则,按照必定 流程来约定编程的;
提取固定 流程,把变化的部分织入到流程中便可;git
链接点(join point) : 即方法github
切点 (point cut): 链接点的范围,哪些方法;spring
通知(advice): 分为前置通知,后置通知,环绕通知,正常返回通知,异常返回通知数据库
目标对象(target) :被代理对象编程
引入(introduction): 引入新的类和方法,加强现有的bean的功能springboot
织入(weaving): 经过代理技术,为原有对象生成代理对象this
切面(aspect) : 能够定义切点,各种通知和引用的内容google
@Aspect 申明切面spa
通知里面放切点:
@Before 前置通知
@After 后置通知
@AfterReturn
@AfterThrowning
@Around
@Pointcut 定义切点
切点的指示器:
通知中的参数:
ProceedingJoinPoint jp 链接点信息
jp.proceed();//执行原来的方法
spring采用两种动态代理方式,jdk的动态代理和cglib的动态代理,若是被代理类没有实现接口,spring会切换为cglib的动态代理;
多个切面,使用@Order(value=x) 来定义顺序,前置通知从升序执行,后置通知降序执行;
例子:
package com.lifesense.ihs.tianansp.admin.interceptor; import com.google.common.base.Strings; import com.lifesense.ihs.tianansp.admin.core.TaAdminRestContext; import com.lifesense.opensource.commons.utils.JsonUtils; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import org.springframework.util.StopWatch; import java.lang.reflect.Method; /** * aop */ @Aspect @Service @Order(0) @Slf4j public class ServiceInterceptor { @Pointcut("execution(public * com.lifesense.ihs.**.admin.manager..*.*(..))") public void pointcut() { } private String serviceName() { return "tiananspadmin"; } @Around("pointcut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { StopWatch stopWatch = new StopWatch(); Method method = ((MethodSignature) pjp.getSignature()).getMethod(); final String methodName = method.getDeclaringClass().getCanonicalName().concat(".").concat(method.getName()); stopWatch.start(methodName); Object[] args = pjp.getArgs(); String requestId = TaAdminRestContext.get().getRequestId(); Object returnObj = null; try { returnObj = pjp.proceed(); } catch (Exception ex) { String message = String.format("[%s]服务发生系统错误:%s", this.serviceName(), ex.getMessage()); log.error("{}, method:{},args:{} , ServiceContext:{}", message, methodName, JsonUtils.toJson(args), TaAdminRestContext.get(), ex); throw ex; } finally { stopWatch.stop(); if (log.isDebugEnabled()) { log.debug("timecost_requestId:{} , args:{},returnObj:{},\n{}:", requestId, JsonUtils.toJson(args), JsonUtils.toJson(returnObj), stopWatch.prettyPrint()); } } return returnObj; } }
原创不易,转载请注明出处,欢迎沟通交流。