当前位置: 首页 > news >正文

做网站推广那家好destoon 网站搬迁

做网站推广那家好,destoon 网站搬迁,外贸信息发布平台,网站建设方面的论文** Spring有两大核心特性:IOC(控制反转) 和 AOP(面向切面编程),但是 相比IOC在日常工作中的广泛应用,AOP却常常做了冷板凳,下面我从工作中的场景为大家打开AOP面向切面编程的大门。** 什么是AOP? 在软件业,AOP为Asp…

** Spring有两大核心特性:IOC(控制反转) 和 AOP(面向切面编程),但是 相比IOC在日常工作中的广泛应用,AOP却常常做了冷板凳,下面我从工作中的场景为大家打开AOP面向切面编程的大门。**

什么是AOP?

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

下面用一张图理解一下AOP:

在这里插入图片描述

可以看到,通过AOP技术,我们可以通过将业务中的通用部分抽取出来,并对业务进行加强,而我们只需要关心具体的业务逻辑即可。

下面是AOP相关的一些概念:

  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。

  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。

  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。

  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。

  • Target(目标对象):织入 Advice 的目标对象.。

  • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

那么在工作中,AOP具体怎么用呢?

场景1: 接口限流

背景:假设我们需要对一些接口进行限流,要求同一个用户指定时间内不可重复请求。

代码实现:

  1. 首先在类上面添加@Aspect标识这是一个切面类 并添加@Component注解让其被Spring发现

    @Slf4j
    @Aspect
    @Component
    public class RateLimitingAspect {
    
  2. 创建切面方法,并定义增强类型及切入点

    @Around("@annotation(com.beansmile.common.config.RateLimiting)")public Object rateLimiting(ProceedingJoinPoint pjp) throws Throwable {
    

    其中@Around代表增强类型为环绕增强、除此之外还有:before(执行前) after(执行后),注解的内容是设置的切入点,这里设置的为添加@RateLimiting注解的地方,此处也可以通过表达式设置为 xxx包下的类、xxx类下方法等等

  3. 创建自定义注解: RateLimiting

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface RateLimiting {/*** 间隔时间,单位秒*/int limitInSeconds() default 2;/*** 返回信息*/String returnMsg() default "您的请求太快了,请稍后提交!";
    }
    
  4. 具体逻辑代码

        @Around("@annotation(com.beansmile.common.config.RateLimiting)")public Object rateLimiting(ProceedingJoinPoint pjp) throws Throwable {String method = pjp.getSignature().toShortString();// lockKey = userId:xxxController.xxxMethod()String lockKey = AuthUtil.getUserId() + ":" + method;MethodSignature methodSignature = (MethodSignature) pjp.getSignature();Method signatureMethod = methodSignature.getMethod();// 拿到注解内容RateLimiting rateLimitingAnnotation = signatureMethod.getAnnotation(RateLimiting.class);String returnMsg = rateLimitingAnnotation.returnMsg();int limitInSeconds = rateLimitingAnnotation.limitInSeconds();Boolean lock = redisTemplate.opsForValue().setIfAbsent(method, 1, limitInSeconds, TimeUnit.SECONDS);if (BooleanUtils.isTrue(lock)) {// 放行return pjp.proceed();} else {log.info("请求限流,lockKey:{},间隔时间:{}", lockKey, limitInSeconds);throw new ServiceException(returnMsg);}}
    

上述代码中,我们以 userId + 类名称 + 方法名称 作为唯一标识,通过redis锁的方式进行限流。

测试代码:  这里我们设置了请求间隔为1秒
    @RequestMapping(value = "/test", method = RequestMethod.GET)@RateLimiting(limitInSeconds = 1)public Result<?> test() {// 具体业务逻辑// xxxxxxxxxxxxxreturn Result.OK("操作成功!");}

正常请求:

在这里插入图片描述

快速请求:

在这里插入图片描述

可以看到,我们通过使用AOP的方式实现了 接口限流的逻辑,并且没有修改任何业务逻辑。

场景2: 全局异常捕获

背景:在程序运行时不可避免的会出现一些异常, 如NullPointerException空指针、ArrayIndexOutOfBoundsException数组下标越界等, 这些异常直接抛到前端页面会导致用户体验不好,过多的try/catch捕捉又会导致代码冗余。

代码实现:

  1. 定义切入点
	@Pointcut("execution(public * com.beansmile.modules..*.*Controller.*(..)))")public void exceptionPointcut() {}

这里定义的切入点为 com.beansmile.modules包下 所有控制器下的方法。

  1. 创建异常枚举类
@Getter
@AllArgsConstructor
public enum ExceptionEnum {/*** NullPointerException*/NULL_POINTER(10001, NullPointerException.class, "空指针异常"),/*** ArrayIndexOutOfBoundsException*/ARRAY_INDEX_OUT_OF_BOUND(10002, ArrayIndexOutOfBoundsException.class, "数组下标越界"),/*** IOException*/IO(10003, IOException.class, "输入输出异常");final int code;final Class<?> clazz;final String name;public static ExceptionEnum getEnumByClazz(Class<?> clazz) {for (ExceptionEnum exceptionEnum : values()) {if (clazz.isAssignableFrom(exceptionEnum.clazz)) {return exceptionEnum;}}return null;}
}
  1. 具体逻辑代码
	@Around("exceptionPointcut()")public Object exceptionHandling(ProceedingJoinPoint pjp) throws Throwable {try {return pjp.proceed();} catch (Exception e) {// 通过枚举类获取异常信息ExceptionEnum exceptionEnum = ExceptionEnum.getEnumByClazz(e.getClass());if (null == exceptionEnum) throw e;// 打印异常信息printExceptionInfo(pjp, e);// 抛出自定义异常,并携带错误码用于快速排查。throw new JeecgBootException("网络开小差了,请稍后重试或联系客服![" + exceptionEnum.getCode() + "]");}}private void printExceptionInfo(ProceedingJoinPoint pjp, Exception e) {String methodName = pjp.getSignature().getName();String className = pjp.getTarget().getClass().getSimpleName();log.error("printExceptionInfo_类名:{},方法名:{},异常信息:{}", className, methodName, e.toString());e.printStackTrace();}

上述代码中,通过对异常时进行切入,对异常做了统一抛出和打印日志。

测试代码

    @RequestMapping(value = "/test", method = RequestMethod.GET)public Result<?> test() {// 模拟空指针异常String str = null;str.length();return Result.OK("操作成功!");}

请求接口进行测试:符合预期,统一错误返回,并携带错误码

在这里插入图片描述

查看后端日志: 保留了原始错误信息,并快速记录了错误的发生源头。

printExceptionInfo_类名:ApprovalFlowController,方法名:test,异常信息:java.lang.NullPointerException
java.lang.NullPointerException
http://www.yayakq.cn/news/662065/

相关文章:

  • 凡科建设网站入门版好不注册公司费用流程图
  • 晋城客运东站网站开发ui网站设计模板
  • 摄影网站建立网上学编程
  • 小程序申请流程东莞seo网络公司
  • 外贸自建站可以自己做网站吗什么是网络营销渠道
  • 珠海高端网站制作公司企企管理系统平台
  • 阿里云服务器如何做两个网站做网站jw100
  • 安卓小项目源码免费网站做网站广告的点
  • 2008 iis asp配置网站做民宿网站的系统可行性
  • 贵阳住房和城乡建设局网站外贸推广哪个公司好
  • 大连网站网络公司国外企业邮箱推荐
  • 手机网站设计公司只选亿企邦适合企业员工培训的课程
  • 合肥做公司网站wordpress侧边栏二级菜单
  • 做网站的业务逻辑php网站开发文档怎么写
  • 宁波网站建设设计价格定制网站建设案例课堂
  • 温州微网站公司广州做网站价位
  • 昆明网站建设优化技术wordpress 增加侧边栏
  • 北京高端网站制作公司网站实现多模板切换
  • 自建外贸网站企业电子商务网站平台建设
  • 贵州网站建设 零玖伍壹网络广州网页设计网站
  • 一般的手机网站建设多少钱东阳网站建设有哪些
  • cms 网站建设建筑模板厂家大全
  • 惠州企业网站设计wordpress 文章查看次数
  • 厦门网站怎么做棋牌游戏app软件开发
  • 网站建设"淘宝网" 在颜色选取和搭配方面有哪些值得学习的地方.seo软文是什么意思
  • 网站开发工作怎样公司论坛网站建设规划书
  • 网站建设 项目文档给个免费的网址
  • 乌海网站seo广州确诊病例最新消息
  • h5旅游网站开发买一个app软件要多少钱
  • 同城换物网站为什么做不起来网页设计尺寸怎么算