切面

Spring源码分析之——AOP的原理及初始化细节

倖福魔咒の 提交于 2020-01-25 02:46:53
废话不多说!!!!!! AOP 是 Aspect Oriented Programming 的缩写,译为面向切向编程。 原理:Spring AOP的底层源码是基于动态代理和拦截器模式。 对拦截器有疑问的可以看: 设计模式之——拦截器模式 为什么要动态代理? ——答:因为业务类本身是不会主动调用切面逻辑(避免耦合),所以业务类必须被代理,由代理类负责调用业务类,并且调用切面;Spring AOP的JDK动态代理的Invocation类是:JdkDynamicAopProxy,这个类完完整整地实现了动态代理以及后续的拦截器模式的切面调用。 AOP调用切面的原理? ——答:AOP的切面调用本质上是一个拦截器模式,通过解析配置文件把Adivce Bean(切面Bean)封装成一个个拦截器(Interceptor),组成一个调用链(chain),在代理类中调用,调用方式同拦截器模式一模一样。 看上图,切面Bean可以实现MethodBeforeAdvice, AfterReturning, Throwing等接口,实现invoke方法,而Spring通过MethodBeforeAdviceInterceptor,AfterReturningAdviceInterceptor等拦截器类封装业务切面Bean,这样就可以持有业务Advice Bean对象

Spring AOP通俗理解与应用

笑着哭i 提交于 2020-01-23 13:21:04
目录 AOP 图解AOP 概念 通俗理解AOP 作用 实现方式 应用场景 应用 Aop与SpringAOP的关系   关于AOP,一般都会先去了解AOP的基础概念,如切点、通知、连接点、切入点 、引入和织入等,面对晦涩难懂的概念,很容易陷入困境,找了几篇讲解较好的文章,将其整合起来,帮助深入理解AOP AOP   AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容(Spring核心之一),是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 作用   为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。 图解 传统的纵向体系代码复用: 横向抽取机制(AOP思想): 概念 1.通知(Advice)   就是你想要的功能,也就是上面说的安全,事务,日志等。你得先定义好把,然后在想用的地方用一下。 2.连接点(JoinPoint)   这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后

spring AOP

依然范特西╮ 提交于 2020-01-23 05:00:12
  在软件开发中,分布于应用中多处的功能被称为 横切关注点 。通常,这些横切关注点从概念上是与业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中)。将这些横切关注点与业务逻辑相分离是 面向切面编程 (AOP)所要解决的。依赖注入有助于应用对象之间的解耦,而AOP可以实现横切关注点与他们所影响的对象之间的解耦。   横切关注点可以被模块化为特殊的类,这些类被称为 切面 。   切面的工作被称为 通知 (Advice)。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它应该应用于某个方法被调用之前?之后?之前和之后?还是只在方法抛出异常时?   spring切面可以应用5种类型的通知。   1)Before——在方法别调用之前调用通知。   2)After——在方法完成之后调用通知,无论方法执行是否成功。   3)After-returning——在方法成功执行之后调用通知。   4)After-throwing——在方法抛出异常后调用通知。   5)Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。    连接点(Joinpoint) 是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至是修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为

Spring常见面试题总结(超详细回答)

走远了吗. 提交于 2020-01-22 09:10:26
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面向对象,允许开发者定义纵向的关系

在SpringBoot中使用AOP切面编程

故事扮演 提交于 2020-01-22 07:36:39
如果有对SpringAOP不太懂的小伙伴可以查看我之前的Spring学习系列博客 SpringBoot的出现,大大地降低了开发者使用Spring的门槛,我们不再需要去做更多的配置,而是关注于我们的业务代码本身,在SpringBoot中使用AOP有两种方式: 一、使用原生的SpringAOP(不是很推荐,但这是最基本的应用) 基原理就是之前写的 SpringAOP在web应用中的使用 的第三种方式,使用@AspectJ样式注解方式 第1步,引入Aspect的相关依赖 < dependency > < groupId > org.aspectj </ groupId > < artifactId > aspectjrt </ artifactId > < version > 1.9.1 </ version > </ dependency > <!--织入器--> < dependency > < groupId > org.aspectj </ groupId > < artifactId > aspectjweaver </ artifactId > < version > 1.9.1 </ version > </ dependency > 第二步,在SpringBoot的配置类中开启AspectJ代理 @SpringBootApplication

高德APP全链路源码依赖分析工程

徘徊边缘 提交于 2020-01-22 06:04:06
一、背景 高德 App 经过多年的发展,其代码量已达到数百万行级别,支撑了高德地图复杂的业务功能。但与此同时,随着团队的扩张和业务的复杂化,越来越碎片化的代码以及代码之间复杂的依赖关系带来诸多维护性问题,较为突出的问题包括: 不敢轻易修改或下线对外暴露的接口或组件,因为不知道有什么地方对自己有依赖、会受到影响,于是代码变得臃肿,包大小也变得越来越大; 模块在没有变动的情况下,发布到新版本的客户端时,需要全量回归测试整个功能,因为不知道所依赖的模块是否有变动; 难以判断 Native 从业务实现转变为底层支撑的趋势是否合理,治理是否有效; 这些问题已经达到了我们必须开始治理的程度了,而解决此类问题的关键在于需要了解代码间的依赖关系。 二、高德 APP 平台架构 为了消除一些疑惑,在讨论依赖分析的实现前,先简单说明一下高德 APP 的平台架构,以便对一些名词和场景有一些背景了解。 高德 APP 从语言平台上可以分为 4 个部分,JS 层主要负责业务逻辑和 UI 框架;中间有 C++层做高性能渲染(主要是地图渲染),同时实现了一些切面 API,这样可以在双端只维护一套逻辑了;Android 和 iOS 层主要作为适配层,做一些操作系统接口的对接和双端差异化的(尽可能)抹平。 这里的切面是指 JS 层与 Native/C++ 层的分界线,这里会实现一些切面 API,也就是 JS 层与

Spring 实战-第四章-面向切面的Spring

冷暖自知 提交于 2020-01-21 11:19:23
软件开发中,散布于应用中多处的功能被称为横切关注点(cross-cutting concern),这些横切关注点从概念上是与应用的业务逻辑相 分离的(但是往往会直接嵌入到应用的业务逻辑中)。把这些横切关注点与业务逻辑相分离正式面向切面编程(AOP)所要解决的问题。 如果要重用通用功能,最常见的面向对象技术是继承(inheritance)或委托(delegation)。但是,如果在整个应用中都是用相同的基 类,继承往往会导致一个脆弱的对象体系;而是用委托可能需要对委托对象进行复杂的调用。 横切关注点可以被模块化为特殊的类,这些类被称为切面(aspect)。这样做有两个好处:首先,现在每个关注点都集中于一个地方, 而不是分散到多处代码中;其次,服务模块更简洁,因为它们只包含主要关注点(或核心功能)的代码,二次要关注点的代码被转移到切面中。 AOP术语 通知(Advice) 切面的工作被称为通知,通知定义了切面是什么以及何时使用。Spring切面可以应用5中类型的通知: 前置通知(Before):在目标方法被调用之前调用通知功能; 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么; 返回通知(After-returning):在目标方法成功执行之后调用通知; 异常通知(After-throwing):在目标方法抛出异常后调用通知; 环绕通知(Around)

面向切面的Spring

不羁的心 提交于 2020-01-20 21:52:28
我们知道如何使用依赖注入(DI)管理和配置我们的应用对象,DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与他们所影响的对象之间的解耦。切面能帮助我们模块化横切关注点,横切关注点可以被描述为影响应用多处的功能。 定义AOP术语,描述切面的术语有通知,切点和连接点。 通知定义了切面是什么以及切面何时开始使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它应该应用在某个方法被调用之前?之后?之前和之后都调用?还是只在方法抛出异常时调用? Spring切面可以应用5种类型的通知: 前置通知:在目标方法被调用之前调用通知功能; 后置通知:在目标方法完成之后调用通知功能; 返回通知:在目标方法成功执行之后调用通知功能; 异常通知:在目标方法抛出异常后调用的通知功能; 环绕通知:通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。 我们的应用可能有数千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点,这个点可以是调用方法时,抛出异常时,甚至修改一个字段时,切面代码可以利用这些点插入到应用正常的流程之中,并添加新的行为。 如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确的类和方法名称

store(商城项目)Springboot+springmvc+ajax+mybatis(15-1)

不想你离开。 提交于 2020-01-20 19:26:57
83. 减去订单中的商品的库存 首先,应该在“管理商品数据”的持久层,添加“修改商品库存”的功能,需要执行的SQL语句大致是: UPDATE t_product SET num=#{num}, modified_user=#{modifiedUser}, modified_time=#{modifiedTime} WHERE id=#{id} 除此以外,还应该先获取原来的库存值,需要“根据商品id查询商品详情”的功能,该功能已经开发,则无需重复开发! 所以,在 ProductMapper.java 接口中,需要添加: Integer updateNumById( @Param("id") Integer id, @Param("num") Integer num, @Param("modifiedUser") String modifiedUser, @Param("modifiedTime") Date modifiedTime); 然后配置映射: <!-- 修改商品的库存 --> <!-- Integer updateNumById( @Param("id") Integer id, @Param("num") Integer num, @Param("modifiedUser") String modifiedUser, @Param("modifiedTime") Date

Spring面试专题之aop

[亡魂溺海] 提交于 2020-01-19 20:37:00
1.背景 aop是编程中非常非常重要的一种思想,在spring项目中用的场景也非常广 2.面试问题 2.1.简单的面试问题 1、什么是aop,aop的作用是什么? 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。 Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上允许用户实现自定义切面,用AOP来完善OOP的使用可以把Spring AOP看作是对Spring的一种增强。 2、AOP里面重要的几个名词概念解释: 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。 连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang