spring aop原理

AOP实现原理

点点圈 提交于 2020-01-04 12:24:16
Spring 为解耦而生,其中AOP(面向切面编程)是很浓重的一笔。   本文来探讨一下AOP实现的原理。 一. 概述    代理模式 是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。   按照代理的创建时期,代理类可以分为两种。 静态代理 :由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理 :在程序运行时,运用反射机制动态创建而成。   另外还有 Cglib动态代理 ,它是针对类实现的代理。 二. 静态代理 1. Count.java 1 /** 2 * 定义一个账户接口 3 */ 4 public interface Count { 5 // 查看账户方法 6 public void queryCount(); 7 8 // 修改账户方法 9 public void updateCount(); 10 } 2. CountImpl.java 1 import net.battier.dao.Count; 2 /** 3 * 委托类(包含业务逻辑) 4 *

手写Spring事务框架,阿里架构师一文详解Spring-SpringAOP原理

筅森魡賤 提交于 2020-01-03 17:38:29
本文转载自: 手写Spring事务框架,阿里架构师一文详解Spring-SpringAOP原理 一、Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 WEB层:SpringMVC 业务层:Spring的IoC 持久层:Spring的JDBCTemplate(Spring的JDBC模板

Spring:AOP, 面向切面编程,JDK的动态代理,CGLIB代理,Spring的AOP技术(底层就是JDK动态代理和CGLIB代理技术)

偶尔善良 提交于 2019-12-29 14:30:34
AOP 概述 什么是 AOP, 面向切面编程 AOP 为 Aspect Oriented Programming 的缩写 , 意为:面向 切面 编程 , 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 . AOP 是 OOP 的延续 , 是函数式编程的一种衍生范型 . 利用 AOP 可以对业务逻辑的各个部分进行隔离 , 从而使得业务逻辑各部分之间的耦合度降低 , 提高程序的可重用性 , 同时提高了开发的效率 . - 传统开发模型 : 纵向的编程 . 面向切面编程 : 纵横配合的编程 . AOP 的作用及优势 作用: 在程序运行期间, 不修改任何相关源码对已有方法进行增强。 优势: 减少重复代码 、提高开发效率、维护方便 AOP 的实现方式 使用动态代理模式来实现 可能通过上面的介绍,我们还是没有一个清晰的认识。没关系,我们看看下面的具体应用。 //.模拟事务管理器 public class TransactionManagerHandler { public void begin() { System.out.println("开启事务"); } public void commit() { System.out.println("提交事务"); } public void rollback() { System.out.println("回滚事务"); }

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面向对象,允许开发者定义纵向的关系

Spring AOP概念理解

百般思念 提交于 2019-12-26 00:26:50
1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难。当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不离其宗而已。 2.为什么用aop 1就是为了方便,看一个国外很有名的大师说,编程的人都是“懒人”,因为他把自己做的事情都让程序做了。用了aop能让你少写很多代码,这点就够充分了吧 2就是为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。 3.那些aop的术语 初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂。 1.通知(Advice) 就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。 2.连接点(JoinPoint) 这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。 3.切入点(Pointcut) 上面说的连接点的基础上

慢慢渗透Spring AOP概念(一)

南笙酒味 提交于 2019-12-23 08:33:19
慢慢渗透Spring AOP概念(一) 冷静 小白书生 今天 我们在理解Spring AOP概念的时候我们首先要知道什么是面向切面编程? 1:什么是面向切面编程(AOP)呢? 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 --来自《百度百科》 个人理解: 将那些与业务无关,却为业务模块所共同调用的逻辑进行的区分,比如在项目中我们用到的权限认证,日志记录,事务处理等等 AOP 是一种编程范式,不是编程语言,AOP只能解决特定问题不是解决所有问题,他是OOPd补充而不是替代。 AOP 初衷:1:DRY原则(代码重复性问题)2:Soc原则(关注点分离): 水平分离(展示层->服务层->持久层)/垂直分离(订单-库存的分离)/切面分离(分离功能性需求和非功能性需求) 好了废话不多说开始进行我们今天对于Spring AOP的理解吧! 2 :Spring AOP 的使用方式 本文主要讲解关于注解方式的使用

AOP与JAVA动态代理

偶尔善良 提交于 2019-12-22 01:52:09
1、AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代理类的字节码 2、AOP各种实现机制的比较 以下是各种实现机制的比较: 类别 机制 原理 优点 缺点 静态AOP 静态织入 在编译期,切面直接以字节码的形式编译到目标字节码文件中 对系统无性能影响 灵活性不够 动态AOP 动态代理 在运行期,目标类加载后,为接口动态生成代理类,将切面织入到代理类中 相对于静态AOP更加灵活 切入的关注点需要实现接口。 对系统有一点性能影响 动态字节码生成 CGLIB 在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中 没有接口也可以织入 扩展类的实例方法为final时,则无法进行织入 自定义类加载器 在运行期,目标加载前,将切面逻辑加到目标字节码里 可以对绝大部分类进行织入 代码中如果使用了其他类加载器,则这些类将不会被织入 字节码转换 在运行期,所有类加载器加载字节码前进行拦截 可以对所有类进行织入 3、AOP里的公民 Joinpoint:拦截点,如某个业务方法 Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint Advice:要切入的逻辑 Before Advice:在方法前切入 After

Spring AOP 源码分析

元气小坏坏 提交于 2019-12-21 23:28:05
最近一个星期在研究 Spring AOP 源码,在此过程中发现几遍源码分析的文章很不错,推荐给需要的同学。 Spring AOP 源码解析 走马观花,看个大概的,推荐。 Spring 源码剖析(六)AOP实现原理剖析 在分析过程中列了执行时序图,思路清晰。推荐 Spring AOP 源码分析系列文章导读 Spring AOP 源码分析 - 筛选合适的通知器 Spring AOP 源码分析 - 创建代理对象 Spring AOP 源码分析 - 拦截器链的执行过程 最后四篇强烈推荐!!! 来源: CSDN 作者: pngyul 链接: https://blog.csdn.net/PNGYUL/article/details/103646446

初识Spring框架的AOP机制

☆樱花仙子☆ 提交于 2019-12-20 01:45:27
  AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。本篇结合实际案例详细讲述AOP的原理及实现过程。通过本篇的学习,可以达成如下目标。 ● 理解AOP的编程思想及原理 ● 掌握AOP的实现技术   Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。   例如,在一个业务系统中,用户登录是基础功能,凡是涉及到用户的业务流程都要求用户进行系统登录。如果把用户登录功能代码写入到每个业务流程中,会造成代码冗余,维护也非常麻烦,当需要修改用户登录功能时,就需要修改每个业务流程的用户登录代码,这种处理方式显然是不可取的。比较好的做法是把用户登录功能抽取出来,形成独立的模块,当业务流程需要用户登录时,系统自动把登录功能切入到业务流程中。 代理模式   我们知道,Spring AOP的主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么Spring AOP的底层如何实现对方法的增强?实现的关键在于使用了代理模式   代理模式的作用就是为其它对象提供一种代理,以控制对这个对象的访问

spring注解-AOP动态代理-@EnableAspectJAutoProxy注解如何工作

梦想的初衷 提交于 2019-12-20 01:14:49
一.概述 AOP面向切面编程,生成目标方法所属类的代理类。代理类和目标类的关系:代理类继承目标类,并重载了目标类的方法。 代理类重载方法体里加入了切面业务逻辑和目标类方法的调用。 用户如何使用:从容器中获取目标类,实际上是获取代理类的实例, 代理类实例调用重载了父类的方法,就实现了AOP。 二.步骤 1.在配置类上添加@EnableAspectJAutoProxy注解,开启注解版的AOP功能 2.声明切面类:@Aspect表明这是一个切面类,注:@Aspect是spring-annotation2/libs/com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar的注解, 在其org.aspectj.lang.annotation包下包含了切面相关的的注解。aop包下载地址:https://www.eclipse.orgaspectj 3.声明切面方法: 1.切点:在哪些目标方法上添加该切面方法 。切点表达式:execution(* com.dr.service.*.buy*(..)):方法访问权限 包路径.类名.方法名(参数类型,参数类型...) 参数类型可以用“..”代替。 2.重用切点:在切面中声明切点方法:添加@Pointcut注解, @Pointcut(value="execution(*******)") 切点方法返回值