cglib

Spring AOP 原理

混江龙づ霸主 提交于 2020-03-24 08:49:41
3 月,跳不动了?>>> Spring AOP ,应该是国内面试必问题,网上有很多答案,其实背背就可以。但今天笔者带大家一起深入浅出源码,看看他的原理。以期让印象更加深刻,面试的时候游刃有余。 Spring AOP 原理 简单说说 AOP 的设计: 每个 Bean 都会被 JDK 或者 Cglib 代理。取决于是否有接口。 每个 Bean 会有多个“方法拦截器”。注意:拦截器分为两层,外层由 Spring 内核控制流程,内层拦截器是用户设置,也就是 AOP。 当代理方法被调用时,先经过外层拦截器,外层拦截器根据方法的各种信息判断该方法应该执行哪些“内层拦截器”。内层拦截器的设计就是职责连的设计。 是不是贼简单。事实上,楼主之前已经写过一个简单的例子,地址: 使用 Cglib 实现多重代理 看完之后更简单。 可以将 AOP 分成 2 个部分来扯,哦,不,来分析。。。第一:代理的创建;第二:代理的调用。 注意:我们尽量少贴代码,尽量用文字叙述,因为面试的时候,也是文字叙述,不可能让你把代码翻出来的。。。所以,这里需要保持一定的简洁,想知道细节,看 interface 21 源码,想知道的更细,看 Spring Framework 最新的 master 分支代码。 代码位置: com.interface21.aop 包下。 开始分析(扯): 代理的创建(按步骤): 首先,需要创建代理工厂

代理模式的种类、原理及各种实例详解

流过昼夜 提交于 2020-03-23 14:03:14
3 月,跳不动了?>>> 代理模式是开发中常用的一种设计模式,每一种设计模式的出现都会极大的解决某方面的问题,代理模式也是一样,本文将会用通俗的语言来解释什么是代理模式?代理模式的种类、代码示例、每种代理模式的优缺点和代理模式适用的场景。 代理模式是什么? 首先我们用一个小故事来描述下什么是代理模式,这会让你更快的理解代理模式的相关角色,为后面的各种代理打下基础。 假如,你是一个大明星,人气很旺,粉丝也特别多。因为人气高,所以很多商家想找你代言广告,但是想要找你代言的人特别多,每个商家你都需要进行商务洽谈,如果聊得不错决定合作,后续还需要签署很多合同文件、记录、备案等。这么多商家找你代言,其中你只能选择其中几个代言,即便只选择几个,你也忙不过来。于是你就想了一个办法,给自己找了一个经纪人,给经纪人制定标准让他去对接各商家,经纪人做事很认真负责,不仅剔除了很多不良的商家还对有资格的商家做了详细的记录,记录商家的代言费、商家详细信息、商家合同等信息。于是在商务代言这件事情上你只需要专心代言拍广告,其他的事情交由经纪人一并处理。 分析下整个事件,可以知道,经纪人就是 代理人 ,明星就是 被代理人 。在明星的广告代言中,经纪人处理的商务洽谈和签约环节相当于 代理 ,这就是 代理模式 在实际生活中的简单案例。 其实不止经纪人和明星,生活中还有很多行为本质就是代理模式,比如

Spring AOP 原理剖析(这一篇就够)

白昼怎懂夜的黑 提交于 2020-03-14 17:38:27
Spring AOP 学习记录 AOP(面向切面编程)方面的知识又是看了忘忘了看,今天有空记录下AOP的知识点。主要分为以下几方面: ​ 1、AOP相关术语 ​ 2、基础知识及示例 ​ 3、增强分类 1、AOP相关术语 连接点(Joinpoint) 一个类拥有一些边界性质的特定点,如一个类的各个方法就可称为连接点。 切点(Pointcut) 切点就是在众多连接点中选择自己感兴趣的连接点,如果将连接点比作一个数据库中的所有记录,那么切点就是一个查询语句的查询条件。 增强(Advice) 增强是置入目标连接点的一段代码,增强本身携带方位信息,如方法调用前、调用后、调用前后、异常抛出使等。 切面(Aspect) 切面由切点和增强组成,既包含增强逻辑和方位信息,也包含连接点信息。 目标对象(Target) 增强逻辑织入的目标类。 引介(Introduction) 引介是一种特殊的增强,它为类提供一些属性和方法。这样,即是一个业务类原本没实现某个接口,通过AOP的引介功能也可以动态的为该类添加接口实现逻辑,让该类成为接口的实现类。 织入(Weaving) 织入就是讲增强添加到目标类的具体方法上的过程。AOP有三种织入方式①编译期织入、②类装载期织入、③动态代理织入(Spring一般采用的方式) 代理(Proxy) 一个类被AOP织入增强后,就产生了一个代理结果类。它融合了增强逻辑

Spring之AOP入门

寵の児 提交于 2020-03-12 02:01:16
Spring AOP入门 1、AOP 1.1、概念 AOP为面向切面编程,采用动态代理实现。 1.2、优点 采用动态代理的方式,可以增强原有的目标类的方法,我们可以在目标方法执行前后分别做一些事情。 对于aop就可以在5种通知里做一些事情,比如说数据库连接的释放,日志的打印,事务的操作。 这种方式,使得不用修改原有程序,就可以增加功能,降低了耦合。 1.3、结构 2、AOP入门案例 2.1、AOP前 AOP采用动态代理实现,故很有必要在看AOP前先看动态代理的实现。动态代理分为两种,对于有接口,有实现类的可以采用jdk动态代理,对于没有接口,只有实现类的,需要采用cglib代理。 2.1.1、依赖包 <dependencies> <dependency> <artifactId>org.springframework</artifactId> <groupId>spring-core</groupId> <version>3.2.7.RELEASE</version> </dependency> <dependency> <artifactId>org.springframework</artifactId> <groupId>spring-context</groupId> <version>3.2.7.RELEASE</version> </dependency>

AOP 详解

我的未来我决定 提交于 2020-03-11 12:56:59
看了半天,才搞懂 spring AOP 的原理。之前一直都给别人 说不清楚。现在,说一遍,加深印象。 AOP 的原理: 涉及到了 设计模式的 代理模式。 代理模式的实现呢,我们可以分为 静态代理 和 动态代理。 静态代理,主要是 一个接口,一个接口实现类 和 实现该接口的 代理类。 这些类都是在编译时 就确定好了,所以叫做静态代理,缺点 在于 每次都要写 一个实现接口的 代理类。 因此 出现了 动态代理。 动态代理 有 很多种框架。AspectJ、JBoss Aop、Spring Aop. 我们主要讨论 spring Aop。 AOP 实现有 JDK动态代理 和 Cglib 动态代理。spring AOP 这两种都是支持的。 单纯不使用spring AOP 去实现 JDK 动态代理,那么就需要 存在一个被代理的接口 和 被代理接口的实现类, 再创建一个实现 InvocationHandler 接口的类,在 invoke 方法中定义 代理类需要做的行为。 通过调用 Proxy.newProxyInstance 就可以为 被代理接口 动态生成一个 class 代理类。之后 只要调用方法的时候,只使用 代理类去调用,不使用 实现类。就能完成动态代理。 JDK 动态代理 生成的类 实现了 被代理接口,继承了 Proxy。由于java 只支持单继承,因此在 继承Proxy 之后,只能选择

java动态代理cglib基于子类代码增强案例

可紊 提交于 2020-03-09 15:39:33
相对于Proxy不同的是,Proxy是基于接口的动态代理,而cglib是子类的 第一步导入cglib的jar包 < dependencies > < dependency > < groupId > cglib < / groupId > < artifactId > cglib < / artifactId > < version > 3.2 .12 < / version > < / dependency > < / dependencies > 普通类 public class Producer { /** * 销售 * @param money */ public void saleProduct ( float money ) { System . out . println ( "销售产品:并拿到钱" + money ) ; } /** * 售后 * @param money */ public void afterService ( float money ) { System . out . println ( "提供售后,并拿到钱" + money ) ; } } 测试类 /** * 模拟一个消费者 * @author DELL */ public class Client { public static void main ( String [ ] args )

设计模式学习---代理模式

和自甴很熟 提交于 2020-03-07 12:41:16
代理模式---我们编程的代码可以分为业务代码与非业务代码,非业务代码可能有日志记录,事务管理,权限校验等,使用到代理模式把业务代码和非业务代码区分开来帮助降低耦合且具有良好的扩展性,就是把一些事情不需要业务类执行的操作交给代理类执行 代理模式主要分为三种,静态代理、动态代理、Cglib代理 一、静态代理 静态代理的条件是目标类与代理类必须实现同一个接口然后通过调用相同的函数完成对目标函数的调用 ,业务操作由目标类实现,非业务操作由代理类实现 1.接口 public interface Test { void test(); } 2.目标类 public class TestImpl implements Test{ @Override public void test() { System. out .println( " 业务代码静态代理测试 " ); } } 3.代理类 public class TestProxy implements Test{ private Test test ; public TestProxy(Test test) { this . test = test; } @Override public void test() { System. out .println( " 业务代码执行之前执行 " ); test .test(); System.

Java的三种代理模式

人走茶凉 提交于 2020-03-07 10:43:11
1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子 用图表示如下: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象 1.1.静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 下面举个案例来解释: 模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象实现这个接口的方法UserDao.java,此时如果使用静态代理方式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口.调用的时候通过调用代理对象的方法来调用目标对象. 需要注意的是,代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法 代码示例:静态代理 /**

使用注解@Transactional,进行声明式事务管理

旧城冷巷雨未停 提交于 2020-03-06 18:28:06
基于 @Transactional 注解进行声明式事务管理的实现步骤分为两步: 启用声明式事务管理,在配置类上添加@EnableTransactionManagement,新版本中也可不添加(例如新版Spring Boot项目)。 将 @Transactional 注解添加到合适的业务类或方法上,并设置合适的属性信息。 代码示例: @Transactional(timeout = 30, readOnly = false, isolation = Isolation.READ_COMMITTED, rollbackFor = Throwable.class, propagation = Propagation.REQUIRED) @Service public class SysUserServiceImpl implements SysUserService { @Transactional(readOnly = true) @Override public PageObject<SysUserDeptVo> findPageObjects( String username, Integer pageCurrent) { … } } @Transactional注解中的属性说明,ru上面代码中: timeout 事务的超时时间,默认值为-1,表示没有超时显示。如果配置了具体时间

AOP面试知识整理,^_^-包括spring Aop

妖精的绣舞 提交于 2020-03-04 23:50:07
讲到java企业级开发框架,就不可避免的讲到 IOC,AOP,MCV   今天面试时被问到AOP,讲的很乱,这里整理笔记,包括AOP,spring-AOP的部分知识,错误的地方请小伙伴指出来. 谈谈你对AOP的理解: AOP概念(Aspect-Oriented Programming): 即面向切面编程,与OOP(Object - Oriented Programming,面向对象编程)相辅相成,AOP的基本单元为Aspect(切面),Struts2 的拦截器设计就是基于AOP的思想。 AOP原理: 大型系统中的 通用的服务型的代码会穿插在各个业务类 ,方法中,随着系统规模的增大,会造成 大量的代码重复 ,,且与核心代码没有太多的关系。 系统中的业务可分为 核心关注点和横切关注点 , 核心关注点是业务处理的主要流程,横切关注点是与核心业务无关的通用业务。如日志权限 等,各个横切点离散的穿插与核心业务中。导致系统中的每一个模块代码都与这些业务具有很强的依赖性,当需要添加横切功能时,需要大幅修改已有的代码。 AOP即解决这个问题, 使用AOP框架,能够将这些影响多个类的通用性服务抽取出来,(即切面) ,并通过 配置的方式明确在那些位置插入这些服务, 系统运行后,AOP框架在指定的时机自动运行这些服务,从而达到核心业务逻辑和服务性逻辑分离的目的,减少了重复代码的