spring aop原理

面向切面编程(aop)

痞子三分冷 提交于 2019-12-17 11:11:53
1、AOP的概念: aop采用了横向抽取机制替代了传统地纵向继承体系的重复性代码,不通过过修改源代码可以实现功能的添加 2、AOP的原理: 使用动态代理的方式,创建接口实现类的代理类 注:使员工jdk的动态代理是针对有接口的情况 使用cglib动态代理是针对没有接口的情况,创建某个类子类的代理类 3.AOP的相关术语: 1)JointPoint(连接点):那些被拦截到的点,主要指方法,因为spring框架中只支持方法类型的连接点,也就是类里面可以被增强的方法 2)PointCut(切入点):对哪些需要拦截的JointPoint的定义,实际就是类里面实际被增强的方法 3)Advice(通知\增强):对拦截到的JointPoint所做的事叫做通知,通知分为前置通知,后置通知,环绕通知,异常通知,最终通知(切面需要完成的功能),就是实际添加的功能的逻辑 前置通知:方法之前执行 后置通知:方法之后执行 环绕通知:方法之前之后执行 异常通知:方法异常执行 最终通知:后置之后执行 4)Aspect(切面):通知与切入点的结合,把增强具体应用到切入点的过程 5)Introduction(引介):在不修改代码的前提下,在运行期间动态的向类中添加一些属性或者方法 6)Target(目标对象):代理的目标对象(要增强的类) 7)Weaving(织入)

Spring AOP的使用场景及其原理

牧云@^-^@ 提交于 2019-12-16 06:45:14
1. AOP是什么? AOP(Aspect Oriented Programming),面向切面编程。顾明思议就是通过某个切入点(比如方法开始、结束)向某个切面(被切的对象)切入环绕通知(需要切入的逻辑代码)。比如一个类中的所有方法执行前都需要打印日志,那么可以通过AOP的方式来统一实现,而不需要在每个方法中都加入打印日志的代码逻辑。 Spring中可以通过配置或者注解方式来实现统一切入逻辑功能(比如事务)。 2. AOP的使用场景 1) 日志记录、监控优化 2) 权限控制 3) 事务管理 4) 缓存 5) 持久化 ..... 3. Spring AOP的实现 Spring AOP实现由两种方式: 1)JDK动态代理:基于Java反射机制实现的(涉及java.lang.reflect包中的Proxy和InvocationHandler)。 2)Cglib动态代理:使用底层字节码技术,生成一个子类来代理父类,即继承被代理类。 代理又分为静态代理和动态代理: 1)静态代理:通过设计一个代理类的方式实现,属于预编译的方式,在程序运行前字节码文件就已经存在了。 2)动态代理:运行时生成字节码对象。 4. JDK动态代理实例 1)定义接口 // 用户服务接口 public interface IUserService { // 插入用户名方法 void insert(String name)

Spring AOP:底层API

▼魔方 西西 提交于 2019-12-16 00:51:54
上一章介绍了Spring AOP的概念和基本用法,本章探寻SpringAOP更底层API,一窥Spring AOP的实现原理。在使用层面,上一章介绍的知识完全足够了,并不推荐在实际项目中使用本章介绍的API。 本章对应的官方 原文档的地址 。 PointCut API 通过上一章我们知道,@PoinCut注解可以定义的切点,可在多个通知之间复用。因此在实现层面,切点和通知也是完全解耦的。切点通过接口 org.springframework.aop.Pointcut 来定义。 public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); } PoingCut接口被分成了两个部分,一个部分叫ClassFilter,一个部分叫MethodMatcher,通过名字很容猜到用途。这样的设计一方面进一步方便重用,一方面也能提高切点的执行效率。 ClassFilter定义如下,判断一个类与切点是否匹配,如果该方法总是返回true,说明切点和任意类型都匹配。 public interface ClassFilter { boolean matches(Class clazz); } 相对来说,MethodMatcher更复杂一些: public interface

Spring-AOP

感情迁移 提交于 2019-12-11 20:29:53
一、AOP: Spring的问题: Spring的AOP解决: 示例: 二、Spring AOP AspectJ:java社区里最完整最流行的AOP框架。   在Spring2.0以上版本中,可以使用基于AspectJ注解或基于XML配置的AOP。 1)、首先加入jar包: com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aop-4.0.4.RELEASE.jar spring-aspects-4.0.4.RELEASE.jar commons-logging-1.1.3.jar spring-beans-4.0.4.RELEASE.jar spring-context-4.0.4.RELEASE.jar spring-core-4.0.4.RELEASE.jar spring-expression-4.0.4.RELEASE.jar 2)、在配置文件中加入AOP的命名空间 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org

Android面向切面编程(AOP)

喜你入骨 提交于 2019-12-09 14:07:05
Android面向切面编程(AOP) AOP简介 什么是AOP AOP术语 AOP与OOP区别 AOP的实现方式和原理 Android中使用AspectJ 配置环境 常用注解介绍 代码实现 其他 AOP简介 什么是AOP AOP(Aspect Oriented Programming),中译为 面向切面编程 ,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是函数式编程的一种衍生范型。AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高代码的灵活性和可拓展性。在Android中,AOP主要用于 日志记录,权限控制,性能统计,安全控制,事务处理,异常处理,热修复,埋点 等功能。 AOP术语 通知、增强处理(Advice) :就是你想要的功能,也就是上面说的日志、耗时计算等。 连接点(JoinPoint) :允许你通知(Advice)的地方,那可就真多了,基本每个方法的前、后(两者都有也行),或抛出异常是时都可以是连接点(spring只支持方法连接点)。AspectJ还可以让你在构造器或属性注入时都行,不过一般情况下不会这么做,只要记住,和方法有关的前前后后都是连接点。 切入点(Pointcut) :上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有十几个连接点了对吧

ASM原理详解,以及使用附代码,AOP利器

雨燕双飞 提交于 2019-12-08 10:03:49
少年,git代码,带你快速理解: https://github.com/singgel/eight-sorting-algorithms/tree/master/src/test/java/com/hks/eightsortingalgorithms/asm 一、什么是ASM   ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。asm字节码增强技术主要是用来反射的时候提升性能的,如果单纯用jdk的反射调用,性能是非常低下的,而使用字节码增强技术后反射调用的时间已经基本可以与直接调用相当了   使用ASM框架需要导入asm的jar包,下载链接:asm-3.2.jar。 二、如何使用ASM   ASM框架中的核心类有以下几个:   ① ClassReader:该类用来解析编译过的class字节码文件。   ② ClassWriter:该类用来重新构建编译后的类,比如说修改类名、属性以及方法

Spring知识点整理

我的梦境 提交于 2019-12-06 08:45:06
Spring中的IOC和AOP;   ioc 控制反转 将对象的实例化过程交给SpringIOC组件,不用程序员手动去new对象,引入IOC可以让我们更加关注业务逻辑,IOC实际就是解析XML或者通过知足接反射机制加载对应的类。   aop 面向切面编程 将传统程序执行过程看做纵向执行的过程,每个方法当做一个点,基于这些点做增强处理,形成了横向的切面,包含原有方法和增强方法,不改变原有的代码结构,添加额外功能。将常用的功能【事务管理,日志管理,权限管理,打印,缓存,异常...】隔离,实现高内聚低耦合,便于后期维护。 SpringAop 和 IOC 的 实现原理   AOP:面向切面编程 在不影响当前方法的情况下,对方法的前后进行增强和扩展。比如 SpringMvc 的拦截器,Spring 中的事务处理都是通过 AOP 实现的。底层是通过动态代理实现的(jdk 自带的动态代理,Cglib 动态代理)。   IOC:控制反转 把对象交给 Spring 来管理,防止重复造轮子,降低系统的耦合性,提高项目的开发效率。底层是通过反射实现的。 Spring 事务的传播机制 事务传播行为就是多个事务方法相互地欧昂,事务如何在这些方法见传播,spring支持7种事务传播行为: 1.Required:           如果当前有事务就执行当前事务,如果没有就创建一个事务 2.Supports: 

Filter、Intercepter、AOP的区别

旧城冷巷雨未停 提交于 2019-12-05 13:38:23
在使用Spring MVC开发RESTful API的时候,我们经常会使用Java的拦截机制来处理请求,Filter是Java本身自带拦过滤器,Interceptor则是Spring自带的拦截器,而Aspect切面是Spring AOP一个概念,主要的使用场景有:日志记录、事务控制和异常处理,该篇文章主要说说它们是如何实现的以及他们之间的差别,在这过程中也会探讨全局异常处理机制的原理以及异常处理过程。 Filter 我对 Filter 过滤器做了以下总结: 介绍: java的过滤器,依赖于Sevlet,和框架无关的,是所有过滤组件中最外层的,从粒度来说是最大的,它主要是在过滤器中修改字符编码(CharacterEncodingFilter)、过滤掉没用的参数、简单的安全校验(比如登录不登录之类) 实现和配置方式 1.直接实现 Filter接口+@Component 2. @Bean+@Configuration (第三方Filter) 3. web.xml 配置方式 Filter的实现方式 @Componentpublic class TimeFilter implements Filter { @Override   public void init(FilterConfig filterConfig) throws ServletException {     System

基于aop的日志记录方式实现

非 Y 不嫁゛ 提交于 2019-12-05 10:05:53
说明 最近有个项目需要增加日志记录功能,因为这个项目原来是基于spring开发的,在查阅了相关资料以后,我采用了spring aop的方式实现该需求,然后就有了本篇文章。 思路 我这边需求是这样的:要统计各个接口的调用次数,然后我想加上客户端ip、请求参数、返回结果等信息,而我的接口都是通过controller实现的,所以从原理上讲就是要通过aop拦截所有controller,实现日志记录。项目本身用到了swagger,每个接口都有ApiOperation注解,所以我的实现方式就变成了拦截ApiOperation注解,为什么要拦截ApiOperation,因为ApiOperation注解有对每个接口的描述信息,当然也是因为每个接口方法上都有ApiOperation注解,当然如果你愿意你也可以拦截RequestMapping,下面是我的aop实现: package com.mytest.aop; import io.swagger.annotations.ApiOperation; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang

spring

给你一囗甜甜゛ 提交于 2019-12-04 20:35:22
什么是 Spring 框架? Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring 官网:https://spring.io/。 我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。比如:Core Container 中的 Core 组件是Spring 所有组件的核心,Beans 组件和 Context 组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。 Spring 官网列出的 Spring 的 6 个特征: 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。 Web支持 : Spring MVC和Spring WebFlux Web框架。 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。 语言 :Kotlin,Groovy,动态语言。 列举一些重要的Spring模块? 下图对应的是 Spring4.x