首页 文章 精选 留言 我的

精选列表

搜索[配置],共10000篇文章
优秀的个人博客,低调大师

SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

一、AOP切面编程 1、什么是AOP编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 2、AOP编程特点 1)AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 2)经典应用:事务管理、性能监视、安全检查、缓存 、日志等 3)aop底层将采用代理机制进行实现 4)接口 + 实现类 :spring采用 jdk 的动态代理Proxy 5)实现类:spring 采用 cglib字节码增强 3、AOP中术语和图解 1)target:目标类 需要被代理的类。例如:UserService 2)Joinpoint:连接点 所谓连接点是指那些可能被拦截到的方法。例如:所有的方法 3)PointCut:切入点 已经被增强的连接点。例如:addUser() 4)advice:通知/增强 增强代码。例如:after、before 5)Weaving:织入 指把增强advice应用到目标对象target来创建新的代理对象proxy的过程. 6)proxy 代理类 7) Aspect(切面): 是切入点pointcut和通知advice的结合 一个线是一个特殊的面。 一个切入点和一个通知,组成成一个特殊的面。 二、与SpringBoot2.0整合 1、核心依赖 <!-- AOP依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2、编写日志记录注解 package com.boot.aop.config; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogFilter { String value() default "" ; } 3、编写日志记录的切面代码 这里分为两种情况处理,一种正常的请求日志,和系统异常的错误日志。核心注解两个。@Aspect和@Component。 package com.boot.aop.config; import com.alibaba.fastjson.JSONObject; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; @Aspect @Component public class LogAspect { private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class) ; @Pointcut("@annotation(com.boot.aop.config.LogFilter)") public void logPointCut (){ } @Around("logPointCut()") public Object around (ProceedingJoinPoint point) throws Throwable { Object result = null ; try{ // 执行方法 result = point.proceed(); // 保存请求日志 saveRequestLog(point); } catch (Exception e){ // 保存异常日志 saveExceptionLog(point,e.getMessage()); } return result; } private void saveExceptionLog (ProceedingJoinPoint point,String exeMsg){ LOGGER.info("捕获异常:"+exeMsg); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); LOGGER.info("请求路径:"+request.getRequestURL()); MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); LOGGER.info("请求方法:"+method.getName()); // 获取方法上LogFilter注解 LogFilter logFilter = method.getAnnotation(LogFilter.class); String value = logFilter.value() ; LOGGER.info("模块描述:"+value); Object[] args = point.getArgs(); LOGGER.info("请求参数:"+ JSONObject.toJSONString(args)); } private void saveRequestLog (ProceedingJoinPoint point){ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); LOGGER.info("请求路径:"+request.getRequestURL()); MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); LOGGER.info("请求方法:"+method.getName()); // 获取方法上LogFilter注解 LogFilter logFilter = method.getAnnotation(LogFilter.class); String value = logFilter.value() ; LOGGER.info("模块描述:"+value); Object[] args = point.getArgs(); LOGGER.info("请求参数:"+ JSONObject.toJSONString(args)); } } 4、请求日志测试 @LogFilter("保存请求日志") @RequestMapping("/saveRequestLog") public String saveRequestLog (@RequestParam("name") String name){ return "success:"+name ; } 切面类信息打印 /** * 请求路径:http://localhost:8011/saveRequestLog * 请求方法:saveRequestLog * 模块描述:保存请求日志 * 请求参数:["cicada"] */ 5、异常日志测试 @LogFilter("保存异常日志") @RequestMapping("/saveExceptionLog") public String saveExceptionLog (@RequestParam("name") String name){ int error = 100 / 0 ; System.out.println(error); return "success:"+name ; } 切面类信息打印 /** * 捕获异常:/ by zero * 请求路径:http://localhost:8011/saveExceptionLog * 请求方法:saveExceptionLog * 模块描述:保存异常日志 * 请求参数:["cicada"] */ 三、源代码地址 GitHub地址:知了一笑 https://github.com/cicadasmile 码云地址:知了一笑 https://gitee.com/cicadasmile

优秀的个人博客,低调大师

阿里云9.9元学生服务器如何购买和配置方法

一.通过学生价购买云服务器步骤一:个人认证与实名认证 1.进入阿里云官网2.点击右上角登录按钮(这里使用的是淘宝账号密码支付,这个大家应该都有吧,没有自己去注册个淘宝账号) 3.输入淘宝账号密码后点击激活 4.之后点头像后点击实名认证 5.点击支付宝认证 6.点击立即认证后进入支付宝登录界面,输入支付宝验证码进行验证登录 7.勾选我同意之后点击确认,弹窗之后点击获取验证码后输入短信验证码 个人认证成功后进行学生认证 8.点击学生认证完善全部信息完成学生认证 步骤二:在阿里云app中购买学生价服务器.由于阿里云学生价服务器只能在阿里云app中购买,因此以下操作为app中的操作 1.下载”阿里云app” 并安装(安装步骤略) 2.使用app登录阿里云客户端(淘宝账号密码) 3.登录成功:点击学生专区4.点击学生特权5.点击购买后选择操

优秀的个人博客,低调大师

Node.js 应用故障排查手册 —— 冗余配置传递引发的内存溢出

楔子 前面一小节我们以一个真实的压测案例来给大家讲解如何利用Node.js 性能平台生成的 CPU Profile 分析来进行压测时的性能调优。那么与 CPU 相关的问题相比,Node.js 应用中由于不当使用产生的内存问题是一个重灾区,而且这些问题往往都是出现在生产环境下,本地压测都难以复现,实际上这部分内存问题也成为了很多的 Node.js 开发者不敢去将 Node.js 这门技术栈深入运用到后端的一大阻碍。 本节将以一个开发者容易忽略的生产内存溢出案例,来展示如何借助于性能平台实现对线上应用 Node.js 应用出现内存泄漏时的发现、分析、定位问题代码以及修复的过程,希望能对大家有所启发。 本书首发在 Github,仓库地址:https://github.com/aliyun-node/Node.js-Troubleshoot

优秀的个人博客,低调大师

阿里云9.9元学生服务器的购买和配置方法

一.通过学生价购买云服务器 步骤一:个人认证与实名认证 1.进入阿里云官网2.点击右上角登录按钮(这里使用的是淘宝账号密码支付,这个大家应该都有吧,没有自己去注册个淘宝账号) 3.输入淘宝账号密码后点击激活 4.之后点头像后点击实名认证 5.点击支付宝认证 6.点击立即认证后进入支付宝登录界面,输入支付宝验证码进行验证登录 7.勾选我同意之后点击确认,弹窗之后点击获取验证码后输入短信验证码 个人认证成功后进行学生认证 8.点击学生认证完善全部信息完成学生认证 步骤二:在阿里云app中购买学生价服务器 .由于阿里云学生价服务器只能在阿里云app中购买,因此以下操作为app中的操作 1.下载”阿里云app” 并安装(安装步骤略) 2.使用app登录阿里云客户端(淘宝账号密码) 3.登录成功:点击学生专区4.点击学生特权5.点击购买后选

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册