切面

AOP的底层实现-CGLIB动态代理和JDK动态代理

依然范特西╮ 提交于 2020-01-02 00:46:36
引自:https://blog.csdn.net/dreamrealised/article/details/12885739 AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础。它是一种面向切面编程的思想。关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来讲解下AOP的核心功能的底层实现机制:如何用动态代理来实现切面拦截。 AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。 那么动态代理是如何实现将切面逻辑(advise)织入到目标类方法中去的呢?下面我们就来详细介绍并实现AOP中用到的两种动态代理。 AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效

Spring&&AOP

∥☆過路亽.° 提交于 2019-12-30 09:38:40
1.Spring 的 AOP 简介 1.1 什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 1.2 AOP 的作用及其优势 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强 优势:减少重复代码,提高开发效率,并且便于维护 1.3 AOP 的底层实现 实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。 1.4 AOP 的动态代理技术 常用的动态代理技术 JDK 代理 : 基于接口的动态代理技术 cglib 代理:基于父类的动态代理技术 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZfexG26-1577666296837)(img\图片1.png)] 1.5 JDK 的动态代理 ①目标类接口 public interface TargetInterface { public void method ( ) ; } ②目标类 public class Target implements TargetInterface { @Override

Spring AOP术语

蹲街弑〆低调 提交于 2019-12-29 14:31:16
1、AOP术语 1)连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就称为“连接点”。Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。 2)切点(Pointcut) 每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。AOP通过“切点”定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责切点所设定的查询条件,找到对应的连接点。其实确切地说,不能称之为查询连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。 3)增强(Advice) 增强是织入到目标类连接点上的一段程序代码,在Spring中

Spring AOP

a 夏天 提交于 2019-12-27 07:27:34
1.什么是AOP? Aspect Orientied Programming 面向切面编程 在java EE中有 OOA 面对对象分析 OOD 面对对象设计 OOP 面对对象编程 2.AOP涉及到核心概念 ###Aspect 切面 抽取了共通业务逻辑的组件 JoinPoinr 连接点 切面作用的一个一个位置叫连接点 一般指的是方法 ####Pointcut 切点 一堆连接点的集合 就是切点 后面会使用表达式来说明 就是后面的切点表达式的写法 Target 目标 将要增强功能的对象 Proxy 代理 增强之后的对象 (1) SUN 公司的 JDK代理 API proxy-target-class="false" servie (2) CGLIB 的 动态代理API proxy-target-class="true" service的接口 iservice ###Advice 通知 ---- 调用的时机(目标方法调用之前 调用之后 调用前后 最终 和 异常) 切面 --- 通知 ---- 切点 3.实现AOP 的步骤 3.1.写一个Service 类 然后在配置文件 创建这个类对应的对象 这个Service 类中有 登录 和 注册的方法 里面输出 登录和注册的信息即可 <!--配置XdlUserService --> <bean id="xdlUserService" class=

Spring的基础知识点,面试常问

 ̄綄美尐妖づ 提交于 2019-12-27 02:02:27
1、Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。 常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等); Spring AOP:AOP服务; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? (1)spring属于低侵入式设计,代码的污染极低; (2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; (3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 (4)spring对于主流的应用框架提供了集成支持。 3、Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系

【源码分析】01-Spring源码-AOP

爱⌒轻易说出口 提交于 2019-12-27 00:41:19
知识点1:SpringAOP原理 1、 什么是AOP编程 AOP: Aspect Oriented Programming 面向切面编程。   面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。   主要的功能是: 日志记录,性能统计,安全控制,事务处理,异常处理 等等。   主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。   可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文章模块等等),而AOP的利刃是横向切入系统

69道Spring面试题和答案

烈酒焚心 提交于 2019-12-26 18:41:35
目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。 2. 使用Spring框架的好处是什么? 轻量: Spring 是轻量的,基本的版本大约2MB。 控制反转: Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 面向切面的编程(AOP): Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器: Spring 包含并管理应用中对象的生命周期和配置。 MVC框架 :Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 事务管理: Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。 异常处理: Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。 3. Spring由哪些模块组成

java aop面向切面编程

泄露秘密 提交于 2019-12-26 07:43:05
最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思。看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果。http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming 面向切面编程。解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。 AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能。最常见的就是事务控制。工作之余,对于使用的工具,不免需要了解其所以然。学习了一下,写了些程序帮助理解。 AOP 主要是利用代理模式的技术来实现的。 静态代理(代码如下): package com.practice.proxypattern; public interface ITalk { public void talk(String msg); } package com.practice.proxypattern; public class PeopleTalk implements ITalk { private String username; private String

SpringBoot配置面向切面编程(SpringBoot项目配置5)

江枫思渺然 提交于 2019-12-26 05:49:39
SpringBoot支持Spring中的注解AOP配置,而且配置简单只需要几步即可 1.导入SpringBoot与AOP集成jar包 在pom.xml文件中加入 <!--spring boot与AOP集成jar包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.AOP注解 @Aspect用在类上,代表这个类是一个切面 @Before用在方法上代表这个方法是一个前置通知 @After用在方法上代表这个方法是一个后置通知 @Around用在方法上代表这个方法是一个环绕通知 @Configuration用于定义配置类 3.开发AOP类和方法 (1)开发一个前置AOP @Aspect @Configuration public class BeforeAspect { /* * 前置通知方法 * */ @Before("execution(* com.baizhi.service.*.*(..))") public void before(JoinPoint joinPoint){ System.out.println("目标方法执行之前执行"); } } (2)开发一个后置AOP

SpringBoot AOP切面

淺唱寂寞╮ 提交于 2019-12-26 03:12:16
AOP切面编程,可用于日志管理,今天在网上学了一套,自己写篇博客记录一下。 第一步添加Maven依赖:(aop用于切面编程,lombok简化开发,lombok有兴趣自己去了解一下) 这是我目录的具体结构: 在aspect文件夹新建HttpAspect文件: @Slf4j注解是lombok包下的,为该类提供日志,效果跟 private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class); 是一样的。 @Pointcut注解标记切面的位置,我的是controller包下的所有类 @Before注解标志该方法在controller方法执行前执行 @After注解标志该方法在controller方法执行后执行 @AfterReturning注解标志该方法在返回参数后执行,可以打印controller出参 来源: CSDN 作者: hewenhaoxiansen 链接: https://blog.csdn.net/hewenhaoxiansen/article/details/103703934