aspectj

Aspectj实例探究,解析SentinelResourceAspect源码

自古美人都是妖i 提交于 2020-02-27 09:35:36
为了学习SentinelResourceAspect,这篇文章里我用Aspectj实现一个AOP实例,一起来看下。 Sentinel 提供了 @SentinelResource 注解用于定义资源,支持 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。 SentinelResourceAspect是Sentinel中的核心切面,Sentinel对限流,拦截等的支持都依赖 SentinelResourceAspect,本文回顾AOP相关知识,实现一个AspectJ实例,然后带你从源码角度,探究SentinelResourceAspect的实现。 1、回顾 Spring AOP 知识 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 常见使用场景 性能监控 在方法调用前后记录调用时间,方法执行太长或超时报警。 缓存代理 缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。 软件破解 使用AOP修改软件的验证类的判断逻辑。 记录日志 在方法执行前后记录系统日志。 工作流系统

Spring AOP-06-切入点类型

醉酒当歌 提交于 2020-02-27 08:01:51
切入点是匹配连接点的拦截规则。之前使用的是注解@Pointcut,该注解是AspectJ中的。除了这个注解之外,Spring也提供了其他一些切入点类型: • 静态方法切入点StaticMethodMatcherPointcut • 动态方法切入点DynamicMethodMatcherPointcut • 注解切入点AnnotationMatchingPointcut • 表达式切入点ExpressionPointcut • 流程切入点ControlFlowPointcut • 复合切入点ComposablePointcut • 标准切入点TruePointcut 各种切入点的类图如图: 来源: oschina 链接: https://my.oschina.net/u/3777515/blog/3161843

Spring AOP-00-开篇

此生再无相见时 提交于 2020-02-27 05:03:01
一、下面介绍与Spring AOP相关的一些概念。 1. 横切关注点 一些具有横切多个不同软件模块的行为,通过传统的软件开发方法不能够有效地实现模块化的一类特殊关注点。横切关注点可以对某些方法进行拦截,拦截后对原方法进行增强处理。 2. 切面(Aspect) 切面就是对横切关注点的抽象,这个关注点可能会横切多个对象。 3. 连接点(JoinPoint) 连接点是在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。由于Spring只支持方法类型的连接点,所以在Spring AOP中一个连接点总是表示一个方法的执行。 4. 切入点(Pointcut) 切入点是匹配连接点的拦截规则,在满足这个切入点的连接点上运行通知。切入点表达式如何和连接点匹配是AOP的核心,Spring默认使用AspectJ切入点语法。 5. 通知(Advice) 在切面上拦截到某个特定的连接点之后执行的动作。 6. 目标对象(Target Object) 目标对象,被一个或者多个切面所通知的对象,即业务中需要进行增强的业务对象。 7. 织入(Weaving) 织入是把切面作用到目标对象,然后产生一个代理对象的过程。 8. 引入(Introduction) 引入是用来在运行时给一个类声明额外的方法或属性,即不需为类实现一个接口,就能使用接口中的方法。 二、下面介绍增强的类型

SSM框架整合流程

你说的曾经没有我的故事 提交于 2020-02-26 21:41:56
整合注意事项 要注意 MyBatis 版本整合 Spring 时使用的适配包; 下载整合适配包 https://github.com/mybatis/spring/releases 官方整合示例, jpetstore https://github.com/mybatis/jpetstore-6 整合思路与步骤 1.搭建环境 创建一个动态的WEB工程 2.导入jar 导入SSM需要的jar包 导入整合适配包 导入其它相关支持包、log4j,pageHelper,AspectJ,jackson,jstl 3.搭建SpringMVC web.xml DispatcherServlet HiddenHttpMethodFilter CharacterEncodingFilter <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp

静态AOP-Spring集成AspectJ

北城以北 提交于 2020-02-26 14:37:13
一、XML配置静态AOP load-time-weaver 1、BeanDefinition解析阶段自定义名称空间 load-time-weaver 1.1 注册LoadTimeWeaverBeanDefinitionParser public class ContextNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser()); registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser()); registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser()); registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());

动态AOP-Spring AOP 基于@AspectJ

狂风中的少年 提交于 2020-02-26 14:22:26
XML配置 aspectj-autoproxy 注册自定义命名空间Bean定义解析器 AopNamespaceHandler public class AopNamespaceHandler extends NamespaceHandlerSupport { public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser()); registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser()); registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator()); // Only in 2.0 XSD: moved to context namespace as of 2.1 registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());

AspectJ Idea配置

邮差的信 提交于 2020-02-26 07:35:52
idea网站配置介绍 https://www.jetbrains.com/help/idea/aspectj.html 首先下载AspectJ https://www.eclipse.org/aspectj/downloads.php 我下载的是aspectj-1.9.5.jar,我以为这个要直接添加到lib,原来是需要运行的,双击运行或者java -jar方式运行安装,安装之后会有lib目录,下面有我们需要的aspectjrt.jar和aspectjtools.jar。 首先 激活idea的插件 ,默认是勾选的,可以不用设置。 然后在项目的lib里 添加aspectjrt.jar 。 然后再 添加dependencies 。 最后就可以 创建AspectJ文件 写代码了。这一步如果没有看到Aspect这个选项,说明配置没有成功。 环境配置好了,但是要运行还是配置编译器的,javac编译器不行,不然没有效果,编译aspects需要AspectJ的编译器 ajc ,ajc在上面提到的aspectjtools.jar里。 配置编译器方法 。 来源: oschina 链接: https://my.oschina.net/googlewell/blog/3156320

AOP 面向切面编程

核能气质少年 提交于 2020-02-26 07:02:25
1、AspectJ 补充了SpringAOP的功能. 2、AOP术语: 通知 advice:就等于用于切面的方法 连接点 join point: 在方法的什么时候通知,比如调用前,抛出异常时,甚至修改一个字段时。 切点 poincut: 明确或者正则来匹配在哪些类,哪些方法名,来应用通知。 切面 Aspect:通知和切点组成了一个切面。 引入 Introduction:引入允许我们向现有的类添加新方法或属性。 织入 weaving: 织入是把切面应用到目标对象并创建新的代理对象的过程。 编译时织入:需要特殊的编译器,AspectJ就时用这种方式织入 类加载器: 需要特殊的类加载器,AspectJ5 (load-time weaving)LTW支持这种方式 运行期: 运行期动态创建一个代理类,来完成织入SpringAOP的做法。 3、Spring 提供了4中类型的AOP支持 (Spring大量借鉴了AspectJ) *基于代理的经典SpringAOP *纯POJO 切面 (本质上还是基于代理的AOP,需要XML 配置) *@AspectJ注解驱动的切面 (本质上还是基于代理的AOP,但是可以用类似AspectJ的方式,以注解的方式完成配置) @注入式AspectJ切面(适用于Spring各版本,如果你的需求不仅仅是简单的方法调用,如构造器和属性拦截) 4、指示器语法

回顾Spring(二)

隐身守侯 提交于 2020-02-26 03:52:50
动态代理 代理设计模式的原理: 使用一个代理将原本对象包装起来 ,然后用该代理对象 ” 取代 ” 原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 动态代理的方式 基于接口实现动态代理: JDK 动态代理 基于继承实现动态代理: Cglib 、 Javassist 动态代理 AOP 概述 AOP(Aspect-Oriented Programming , 面向切面编程 ) :是一种新的方法论,是对传 统 OOP(Object-Oriented Programming ,面向对象编程 ) 的补充。 AOP 编程操作的主要对象是切面 (aspect) ,而切面用于 模块化横切关注点(公共功能) 。 在应用 AOP 编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特殊的类里 —— 这样的类我们通常称之为 “ 切面 ” 。 AOP 的好处: 每个事物逻辑位于一个位置,代码不分散,便于维护和升级 业务模块更简洁,只包含核心业务代码 AOP 图解 AOP 术语 横切关注点: 从每个方法中抽取出来的同一类非核心业务。 切面(Aspect):封装横切关注点信息的类,每个关注点体现为一个通知方法。 通知(Advice):切面必须要完成的各个具体工作 目标(Target

AspectJ 切点指示器-06-within和@within

我怕爱的太早我们不能终老 提交于 2020-02-26 00:57:47
target() 限制连接点匹配目标对象为指定类型的类 @target() 限制连接点匹配目标对象为被特定注解标注的类 within()与execution()的功能类似,两者的区别是,within()定义的连接点的最小范围是类级别的(不是接口),而execution()定义的连接点的最小范围可以精确到方法的入参,因此可以认为execution()涵盖了within()的功能。 “@within()”匹配标注了指定注解的类及其子孙类。 最终类结构图 1、Factory package com.test.aspectj.expression; /** * 工厂接口 */ public interface Factory { // 制作产品 void make(); // 运输 void delivery(String address); } 2、PhoneFactory package com.test.aspectj.expression; import com.test.aspectj.expression.annotation.Log; import org.springframework.stereotype.Component; /** * 手机工厂 */ @Component public class PhoneFactory implements Factory { /