aspectj

Springboot中Aspect实现切面(以记录日志为例)

无人久伴 提交于 2020-11-02 05:52:12
前言 今天我们来说说spring中的切面Aspect,这是Spring的一大优势。面向切面编程往往让我们的开发更加低耦合,也大大减少了代码量,同时呢让我们更专注于业务模块的开发,把那些与业务无关的东西提取出去,便于后期的维护和迭代。 好了,废话少说!我们直接步入正题 以系统日志为例 首先,我们先做一些准备工作。 1、新建一个Springboot工程 2、添加必要的依赖 AOP 必须 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> gson主要是我用于数据的处理,不是必须的 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.1</version> </dependency> 个人喜好 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency

你真的确定Spring AOP的执行顺序吗

≯℡__Kan透↙ 提交于 2020-10-28 15:21:14
关注公众号: 后端技术漫谈 ,技术之路不迷路~ 前言 忙,是我这个月的主旋律,也是我频繁鸽文章的借口————蛮三刀把刀 公司这两个月启动了全新的项目,项目排期满满当当,不过该学习还是要学习。这不,给公司搭项目的时候,。 本文内容重点: 问题描述 Spring AOP执行顺序 探究顺序错误的真相 代码验证 结论 本文阅读大概需要:3分钟 码字不易,求个关注,欢迎关注我的个人原创公众号:后端技术漫谈(二维码见文章底部) 问题描述 公司新项目需要搭建一个新的前后分离HTTP服务,我选择了目前比较熟悉的SpringBoot Web来快速搭建一个可用的系统。 鲁迅说过, 不要随便升级已经稳定使用的版本 。我偏不信这个邪,仗着自己用了这么久Spring,怎么能不冲呢。不说了,直接引入了最新的SprinBoot 2.3.4.RELEASE版本,开始给项目搭架子。 起初,大多数的组件引入都一切顺利,本以为就要大功告成了,没想到在搭建 日志切面 时栽了跟头。 作为一个接口服务,为了方便查询接口调用情况和定位问题,一般都会将请求日志打印出来,而Spring的AOP作为切面支持,完美的切合了日志记录的需求。 之前的项目中,运行正确的切面日志记录效果如下图: 可以看到图内的一次方法调用,会输出请求url,出入参,以及请求IP等等,之前为了好看,还加入了分割线。 我把这个实现类放入新项目中

SSM框架之Spring

荒凉一梦 提交于 2020-10-28 09:16:29
IoC (Inversion of Control) 控制反转:对 对象(beans) 控制权的转移,从程序代码本身反转到了外部容器(xml配置文件, applicationContext.xml) 对象的创建不是在view层,而是通过xml配置文件生成的容器创建 配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 注册Service 底层相当于ISomeService service = new SomeServiceImpl(); --> <bean id="myService" class="service.SomeServiceImpl"/> </beans> 程序与配置文件: ApplicationContext容器:反应速度快/占用资源

面试官问 Spring AOP 中两种代理模式的区别,我懵逼了

谁都会走 提交于 2020-10-25 11:16:08
基本介绍 代理模式 是一种结构性设计模式。为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,并允许在将请求提交给对象前后进行一些处理。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 代理模式主要有三种不同的形式: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 动态代理(JDK 代理、接口代理):在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。 cglib 代理(可以在内存动态的创建对象,而不是实现接口,属于动态代理的范畴) 问题 为什么要控制对于某个对象的访问呢?举个例子:有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。 你可以实现延迟初始化:在实际有需要时再创建该对象。对象的所有客户端都要执行延迟初始代码。不幸的是, 这很可能会带来很多重复代码。 在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现:比如类可能是第三方封闭库的一部分。 解决方案 代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。 代理将自己伪装成数据库对象,

Springboot-切面aspect失效/不生效

喜夏-厌秋 提交于 2020-10-22 08:58:55
一、包扫描位置 aspect是否被扫描 @ComponentScan({"com.yh"}) 二、切点语法 切面语法是否正确: @Pointcut("execution(* com.yh..*Controller.*(..))") public void logAspect() {} ... 三、是否缺少依赖 检查是否有如下依赖: <dependency> <groupId> org.aspectj</groupId > <artifactId> aspectjweaver</artifactId > <version> 1.8.8</version > </dependency> 来源: oschina 链接: https://my.oschina.net/u/4517769/blog/4332360

接口中的几种限流实现

我怕爱的太早我们不能终老 提交于 2020-10-04 06:29:43
为什么需要限流 由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统,必须采取流量控制措施。 服务接口的流量控制策略:分流、降级、限流 分流:扩容机器、单元化通道 降级:关闭非核心接口,保证核心接口链路的正常运行 限流:NG限流、业务系统限流、数据库限流 1. 与用户打交道的服务 比如web服务、对外API,这种类型的服务有以下几种可能导致机器被拖垮: 用户增长过快(这是好事) 因为某个热点事件(微博热搜) 竞争对象爬虫 恶意的刷单 这些情况都是无法预知的,不知道什么时候会有10倍甚至20倍的流量进来,如果遇到此类情况,扩容是根本来不及的,弹性扩容也是来不及的; 2. 对内的RPC服务 一个服务A的接口可能被BCDE多个服务进行调用,在B服务发生突发流量时,直接把A服务给调用挂了,导致A服务对CDE也无法提供服务。 这种情况时有发生,解决方案有两种: 1、每个调用方采用线程池进行资源隔离 2、使用限流手段对每个调用方进行限流 限流算法的实现 1. 计数器算法 采用计数器实现限流有点简单粗暴,一般我们会限 制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。

Spring系列.事务管理原理简析

☆樱花仙子☆ 提交于 2020-10-03 07:19:04
Spring的事务管理功能能让我们非常简单地进行事务管理。只需要进行简单的两步配置即可: step1:开启事务管理功能 @Configuration //@EnableTransactionManagement注解有以下几个属性 //proxyTargetClass属相:指定事务的AOP是通过JDK动态代理实现,还是CGLIB动态代理实现。true的话是CGLIB,false的话是JDK动态代理 // 需要注意的是这个属性只有在AdviceMode设置成AdviceMode.PROXY的情况下才会生效,加入使用ASPECTJ这AOP框架的话,这个属性就失效了。 // 另外,这个属性的设定可能会影响其他需要动态代理的类。比如说将这个属性设置成true,@Async注解的方法也会使用CGLIB生成代理类。 // 但是总的来说,这个属性的设置不会造成什么负面影响,毕竟JDK动态代理和CGLIB动态代理都能实现我们的需求 //mode属性:Spring提供的AOP功能有两种实现方式,一种是Spring自带的AOP功能,主要靠JDK代理和CGLIB代理实现,另外一种是通过第三方框架ASPECTJ实现。这个选项 // 就是设定Spring用哪种方式提供AOP功能。AdviceMode.PROXY表示用Spring自带的AOP功能,AdviceMode

Spring系列.事务管理原理简析

心不动则不痛 提交于 2020-10-02 21:11:10
Spring的事务管理功能能让我们非常简单地进行事务管理。只需要进行简单的两步配置即可: step1:开启事务管理功能 @Configuration //@EnableTransactionManagement注解有以下几个属性 //proxyTargetClass属相:指定事务的AOP是通过JDK动态代理实现,还是CGLIB动态代理实现。true的话是CGLIB,false的话是JDK动态代理 // 需要注意的是这个属性只有在AdviceMode设置成AdviceMode.PROXY的情况下才会生效,加入使用ASPECTJ这AOP框架的话,这个属性就失效了。 // 另外,这个属性的设定可能会影响其他需要动态代理的类。比如说将这个属性设置成true,@Async注解的方法也会使用CGLIB生成代理类。 // 但是总的来说,这个属性的设置不会造成什么负面影响,毕竟JDK动态代理和CGLIB动态代理都能实现我们的需求 //mode属性:Spring提供的AOP功能有两种实现方式,一种是Spring自带的AOP功能,主要靠JDK代理和CGLIB代理实现,另外一种是通过第三方框架ASPECTJ实现。这个选项 // 就是设定Spring用哪种方式提供AOP功能。AdviceMode.PROXY表示用Spring自带的AOP功能,AdviceMode