酷科技-免费素材_软件_模板_源码下载_建站资源_源码论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

返回列表 发新帖 SEO优化此页关键词描述信息
查看: 626|回复: 0

Spring AOP源码分析之代理方式如何选择的?

[复制链接]

33

主题

33

帖子

1024

酷币

VIP组

酷币
1024
Spring AOP面向切面编程接口调用耗时
现在我们有个接口要在日志中记录接口耗时,我们会怎么做呢?一般我们会在接口开始和接口结束时获取系统时间,然后二者一减就是接口耗时时间了。如下,在20行我们打印出接口耗时。
1@RestController 2@Slf4j 3public class LoginController { 4    @Autowired 5    LoginService loginService; 6    @RequestMapping("/login/{id}") 7    public Map login(@PathVariable("id") Integer id){ 8        long start = System.currentTimeMillis(); 9        Map result = new HashMap();10        result.put("status","0");11        result.put("msg" , "失败");12        if (loginService.login(id)) {13            result.put("status","1");14            result.put("msg" , "成功");15        }16        long end = System.currentTimeMillis();17        log.info("耗时=>{}ms",end-start);18        return result;19    }20}
启动类:
1@SpringBootApplication2public class SpringaopSbApplication {3    public static void main(String[] args) {4        SpringApplication.run(SpringaopSbApplication.class, args);5    }6}
但是,如果所有接口都要记录耗时时间呢?我们还按这种方式吗?显然不行,这种要在每个接口都加上同样的代码,而且如果后期你老板说去掉的话,你还有一个个的删掉么?简直是不可想象。。所以对于这种需求,其实是可以提炼出来的。我们想,统计接口的耗时时间,无非就是在接口的执行前后记录一下时然后相减打印出来即可,然后在这样的地方去加入我们提炼出来的公共的代码。这就好比在原来的业务代码的基础上,把原来的代码横切开来,在需要的地方加入公共的代码,对原来的业务代码起到功能增强的作用。这就是AOP的作用。
Spring AOP应用场景 - 接口耗时记录
下面我们来看看使用Spring AOP怎么满足这个需求。
首先定义一个切面类TimeMoitor,其中pointCut()方法(修饰一组连接点)是一个切点,@Pointcut定义了一组连接点(使用表达式匹配)aroundTimeCounter()是要加入的功能,被@Around注解修饰,是一个环绕通知(Spring AOP通知的一种),其实就是上面说的在方法执行前后记录时间然后相减再打印出来耗时时间。
1@Aspect 2@Component 3@Slf4j 4public class TimeMoitor { 5    @Pointcut(value = "execution(* com.walking.springaopsb.controller.*.*(..))") 6    public void pointCut(){} 7 8    @Around(value = "com.walking.springaopsb.aop.TimeMoitor.pointCut()") 9    public Object aroundTimeCounter(ProceedingJoinPoint jpx){10        long start = System.currentTimeMillis();11        Object proceed = null;12        try {13             proceed = jpx.proceed();14        } catch (Throwable throwable) {15            throwable.printStackTrace();16        }17        long end = System.currentTimeMillis();18        log.info("耗时=>{}ms",end-start);19        return proceed;20    }21}
然后在LoginController#login方法里我们就可以把日志打印耗时时间的代码删掉了。
1@RestController 2@Slf4j 3public class LoginController { 4    @Autowired 5    LoginService loginService; 6    @RequestMapping("/login/{id}") 7    public Map login(@PathVariable("id") Integer id){ 8        Map result = new HashMap(); 9        result.put("status","0");10        result.put("msg" , "失败");11        if (loginService.login(id)) {12            result.put("status","1");13            result.put("msg" , "成功");14        }15        return result;16    }17}再比如,LoginController里若是还有别的方法,也一样可以应用到。使用Spring AOP的控制台日志:
wdkx2skme2y.jpg (54.52 KB, 下载次数: 0, 售价: 6 酷币)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|酷科技 ( 粤ICP备16006357号-6 )

GMT+8, 2021-6-12 19:32 , Processed in 0.097008 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表