发表于: 2019-11-20 14:36:17

1 1228


今天完成的事情:打印api执行时间

实现思想是aop,AOP的目标是把这些功能集中起来,放到一个统一的地方来控制和管理。利用 AOP 思想,这样对业务逻辑的各个部分进行了隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。以日志为例,声明哪些地方需要打印日志,这个地方就是一个切面,AOP 会在适当的时机为你把打印语句插进切面。

在AOP中切面就是与业务逻辑独立,但又垂直存在于业务逻辑的代码结构中的通用功能组合;切面与业务逻辑相交的点就是切点;连接点就是把业务逻辑离散化后的关键节点;切点属于连接点,是连接点的子集;Advice(增强)就是切面在切点上要执行的功能增加的具体操作;在切点上可以把要完成增强操作的目标对象(Target)连接到切面里,这个连接的方式就叫织入。

@Aspect     将一个java类定义为切面类

@Pointcut   定义一个切入点(可以是一个正则表达式,例如某个package下的所有函数,也可以是一个注解)

根据需要在切入点的不同位置切入内容:

@Before     在切入点开始时,切入内容

@After      在切入点结尾处,切入内容

@Around     在切入点前后处,切入内容,并自己控制何时执行内容的切入

@AfterReturning     在切入点return内容之后切入内容,用来定义对返回值的处理逻辑

@AfterThrowing      在切入点抛出异常后切入内容,用来定义抛出异常之后的处理逻辑

在网上看到了一个例子,通过对接口添加简单注解的方式来打印API的执行时间

声明注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Timer {
}

切面类(注意:需用@Componet标注后,才能被注册到Spring容器中)

@Aspect
@Component
public class TimerAspect {
// 修正Timer注解的全局唯一限定符
   @Pointcut("@annotation(com.example.demo.tool.Timer)")
private void pointcut() {}

@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取目标Logger
       Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass());

// 获取目标类名称
       String clazzName = joinPoint.getTarget().getClass().getName();

// 获取目标类方法名称
       String methodName = joinPoint.getSignature().getName();

long start = System.currentTimeMillis();
logger.info( "{}: {}: start...", clazzName, methodName);

// 调用目标方法
       Object result = joinPoint.proceed();

long time = System.currentTimeMillis() - start;
logger.info( "{}: {}: : end... cost time: {} ms", clazzName, methodName, time);

return result;
}
}

没成功,使用时,在目标方式上加上@Timer,但是注解爆红。

我在对比网上其他人写的切面类,看能不能成功,实在不行就只能换一个了。

明天计划的事情:继续任务
遇到的问题:爆红没解决
收获:对aop的理解更深了


返回列表 返回列表
评论

    分享到