文章 62
浏览 15135
手写spring AOP

手写spring AOP

背景 基于上次手写一个 mini 版的 Spring IoC,考虑把 AOP 也给接入进来 AOP 回顾 AOP 概念 AOP(Aspect Oriented Programming)是面向切面编程。是 OOP 面向对象编程思想的一种补充。 OOP 通过继承,封装,多态等概念构建一个对象的层级结构。构建的是一个纵向的关系。面对横向的问题,实现起来比较复杂,比如日志的输出。使用面向对象的思想,每个类都需要增加日志打印的相关代码。但是使用 aop 就可以很简单的解决这个问题。 aop 将影响了多个类的公共行为(如日志打印)封装为一个可重用模块,定义为一个切面(aspect)。切面中包括切入点,通知,连接点等概念。 切入点:就是需要做切面处理的位置,可以通过 @PointCut 中的 execution 值指定某个包,某个类或者某个方法。同时也可以使用自定义注解标注。 通知:包括 5 种,分别是前置,后置,返回,异常,环绕通知。分别定义增强代码执行的时机。 连接点:是可以用来做为切入点的位置。是程序执行的某个位置,可以为程序执行前,也可以是执行后或者抛出异常等一些时机点 aop 作用是降低程....

Sentinel核心架构源码剖析

Sentinel核心架构源码剖析

笔记链接: https://note.youdao.com/s/ChW1Ja5q

Sentinel规则持久化源码分析

Sentinel规则持久化源码分析

该文章已经加密。

手写mini springIoc

手写mini springIoc

背景 每次在工作中使用 spring,总会被其流畅代码思路和迷人的架构模式以及设计模式吸引,也看过一阵子源码,但总觉得了解的是是而非,所以想着何不自己手写一个 springIoc 用来梳理巩固自己所学的知识,以及自我充电 Spring 核心 **控制反转 (**IoC,Inversion of Control)(本篇文章实现) 传统的 Java 开发模式中,当需要一个对象时,我们使用 new 或者通过 getInstance 等直接或者间接调用构造方法创建一个对象,而在 Spring 开发模式中,Spring 容器使用工厂模式为我们创建了所需要的对象,不需要我们自己去创建了,直接调用 Spring 提供的对象就可以了,这就是控制反转,相信我们在用 Spring 的时候,用 XML 或者注解了解过 面向切面编程(AOP)(后续实现) 在面向对象编程(OOP)中,我们将事务纵向抽成一个个的对象,而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制,事务管理,日志记录等公用操作处理的过程,就是面向切面编程的思想。 面向切面编程也是 Spring ....

spring SpEL 结合AOP玩出花样

spring SpEL 结合AOP玩出花样

背景 最近接到一个需求,需要收集系统产生的行为日志和用户操作行为的日志,有个详情字段,可以需要自定义扩展,按简单方式实现可以通过 AOP 注解,如果仅仅是这样实现的话,日志详情需要耦合在业务代码逻辑中,不太优雅,想着能不能直接有个表达式,通过方法参数组装,这时候想到了 SpEL 表达式机制 Spel 概述 Spring 表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于 Struts2x 中使用的 OGNL 表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与 Spring 功能完美整合,如能用来配置 Bean 定义。 一.SpEl 基础 简述: ** SpEL 是一个支持运行时查询和设置属性值、方法调用、访问数组、属性、构造器等的表达式语言。通过使用标准化语法,SpEL 集成了对象图导航、运算符重载、列表投影、选择和聚合等丰富特性。 ** 示例: 简单写个 helloWorld @Test void testHelloWorld() { ExpressionParser parser = new SpelE....

spring Security使用

spring Security使用

SpringSecurity SpringSecurity 是一个基于 Spring 开发的非常强大的权限验证框架,其核心功能包括: 认证 (用户登录) 授权 (此用户能够做哪些事情) 攻击防护 (防止伪造身份攻击) 我们为什么需要使用更加专业的全新验证框架,还要从 CSRF 说起。 CSRF 跨站请求伪造攻击 我们时常会在 QQ 上收到别人发送的钓鱼网站链接,只要你在上面登陆了你的 QQ 账号,那么不出意外,你的号已经在别人手中了。实际上这一类网站都属于恶意网站,专门用于盗取他人信息,执行非法操作,甚至获取他人账户中的财产,非法转账等。而这里,我们需要了解一种比较容易发生的恶意操作,从不法分子的角度去了解整个流程。 我们在 JavaWeb 阶段已经了解了 Session 和 Cookie 的机制,在一开始的时候,服务端会给浏览器一个名为 JSESSION 的 Cookie 信息作为会话的唯一凭据,只要用户携带此 Cookie 访问我们的网站,那么我们就可以认定此会话属于哪个浏览器。因此,只要此会话的用户执行了登录操作,那么就可以随意访问个人信息等内容。 比如现在,我们的服务器新增了一....

Sentinel控制台规则配置详解

Sentinel控制台规则配置详解

1. Sentinel 控制台介绍 Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则 管理和推送的功能。 Sentinel 控制台包含如下功能: **查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。 ** **监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信 息,最终可以实现秒级的实时监控。 ** **规则管理和推送:统一管理推送规则。 ** 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。 阿里云提供了 企业级的 Sentinel 控制台,应用高可用服务 AHAS ** 实时监控 监控接口的通过的 QPS 和拒绝的 QPS** ** 簇点链路 用来显示微服务的所监控的 API ** 流控规则 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流 量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 同一个资源可以创建多条限流规则。Flo....

LongAdder与直接使用CAS(Compare-And-Swap)操作相比,其效率之所以较高?

LongAdder与直接使用CAS(Compare-And-Swap)操作相比,其效率之所以较高?

<span class="ne-text">LongAdder</span> 与直接使用 CAS 操作相比之所以效率较高,主要原因在于它减少了线程间对同一变量的竞争,从而减少了 CAS 操作的重试次数,提高了性能。接下来将详细解释,并尝试用文字描述来代替示例图。 CAS 操作的问题 CAS 操作是一种乐观锁,它包含三个操作数:内存位置、预期原值及新值。CAS 操作的基本步骤是这样的: 系统先检查内存位置的当前值是否与预期原值相同; 如果相同,系统会将该位置的数据更新为新值; 如果不同,操作失败,并且通常会再次尝试,直到成功为止。 在高并发环境下,若多个线程同时对同一个变量进行更新,它们会不停地执行 CAS 操作。因为这些操作都在争夺同一个变量,导致大多数线程的 CAS 操作失败,并且不得不重试,这会造成大量的 CPU 资源浪费 LongAdder 的工作原理 <span class="ne-text">LongAdder</span> 通过内部分散计数器来减小热点冲突。其基本原理如下: <span class="ne-text"&g....

人民有信仰 民族有希望 国家有力量