发表于: 2019-11-20 14:36:17
1 1225
今天完成的事情:打印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的理解更深了
评论