博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0102-aop
阅读量:4209 次
发布时间:2019-05-26

本文共 2780 字,大约阅读时间需要 9 分钟。

背景

aop的概念很多,比如切点,通知,连接点,引入,织入等;实际上这是一种约定的流程;

约定编程

https://github.com/carterbrother/springbootpractice/tree/master/demo-aop

aop编程

也是按照一定规则,按照一定 流程来约定编程的;

典型场景

  • 数据库事物

提取固定 流程,把变化的部分织入到流程中即可;

概念

连接点(join point) : 即方法

切点 (point cut): 连接点的范围,哪些方法;

通知(advice): 分为前置通知,后置通知,环绕通知,正常返回通知,异常返回通知

目标对象(target) :被代理对象

引入(introduction): 引入新的类和方法,增强现有的bean的功能

织入(weaving): 通过代理技术,为原有对象生成代理对象

切面(aspect) : 可以定义切点,各类通知和引用的内容

springboot的aop的使用

@Aspect 申明切面

通知里面放切点:@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)@Slf4jpublic 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;    }}

原创不易,转载请注明出处,欢迎多沟通交流

你可能感兴趣的文章
OpenGL学习三十八:图片文字
查看>>
OpenGL学习三十九:飘动的旗帜
查看>>
OpenGL学习四十:正玄移动
查看>>
OpenGL环境搭建
查看>>
QT&&QT_Creator_安装配置流程
查看>>
QT 自定义控件
查看>>
Matrix学习——基础知识
查看>>
Android矩阵原理详解(Matrix,ColorMatrix)
查看>>
WINCE的体系结构
查看>>
OpenGL与DirectX 比较
查看>>
应用文件映射进行进程间通讯
查看>>
CentOS5.x 系统安装-图形模式
查看>>
CentOS硬盘安装方法
查看>>
Linux学习记录--关机相关操作
查看>>
Linux学习记录--文件权限
查看>>
Linux学习记录--目录配置FHS
查看>>
Linux学习记录--文件与目录管理
查看>>
Linux学习记录--文件内容查阅
查看>>
Linux学习记录--文件|目录的默认权限与隐藏权限
查看>>
Linux学习记录--命令与文件的查询
查看>>