Spring AOP 前奏--动态代理】的更多相关文章

AOP 是什么东西 首先来说 AOP 并不是 Spring 框架的核心技术之一,AOP 全称 Aspect Orient Programming,即面向切面的编程.其要解决的问题就是在不改变源代码的情况下,实现对逻辑功能的修改.常用的场景包括记录日志.异常处理.性能监控.安全控制(例如拦截器)等,总结起来就是,凡是想对当前功能做变更,但是又不想修改源代码的情况下,都可以考虑是否可以用 AOP 实现. 为什么要面向切面呢,我直接改源代码不是很好吗?当然没有问题,如果情况允许.但是考虑到下面这些情况…
我们知道Spring是通过JDK或者CGLib实现动态代理的,今天我们讨论一下JDK实现动态代理的原理. 一.简述 Spring在解析Bean的定义之后会将Bean的定义生成一个BeanDefinition对象并且由BeanDefinitionHolder对象持有.在这个过程中,如果Bean需要被通知切入,BeanDefinition会被重新转换成一个proxyDefinition(其实也是一个BeanDefinition对象,只不过描述的是一个ProxyFactoryBean).ProxyFa…
软件151 李飞瑶 一.Spring 动态代理中的基本概念  1.关注点(concern)    一个关注点可以是一个特定的问题,概念.或者应用程序的兴趣点.总而言之,应用程序必须达到一个目标    安全验证.日志记录.事务管理都是一个关注点    在oo应用程序中,关注点可能已经被代码模块化了还可能散落在整个对象模型中 2.横切关注点(crosscutting concern)    如何一个关注点的实现代码散落在多个类中或方法中 3.方面(aspect)    一个方面是对一个横切关注点模块…
静态代理与动态代理 静态代理 代理模式 (1)代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. (2)静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理,主要是在方法中首先进行预处理动作,然后调用业务实现类的方法 例子 /** * 定义一个账户接口 * @author Administrator */ public interface Count { //…
深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring…
一: jdk动态代理是Spring AOP默认的代理方法.要求 被代理类要实现接口,只有接口里的方法才能被代理,主要步骤是先创建接口,接口里创建要被代理的方法,然后定义一个实现类实现该接口,接着将被代理对象注入到一个中间对象,中间对象实现InvocationHandler接口,实现该接口可以在 被代理对象调用它的方法前后插入一些代码.Proxy.newProxyInstance()能利用中间对象来生产代理对象. 二: (1)创建接口: package net.wang.aop; /** * 被代…
前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式,AOP思想的实现则是基于代理模式. 代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 代理解决的问题当两个类需要通信时,引入第三方代理类,将两个类的关系解耦,让我们只了解代理类即可,而且代理的出现还可以让…
曾遇到“AOP与动态代理有什么联系”的问题,现把个人观点整理如下: 我觉得,动态代理是AOP的主要实现手段之一,AOP是动态代理的一种应用深化 AOP是一种思想,或者是方法论,类似OOP,是OOP的有力补充:OOP侧重于主要业务功能设计(一般关注点):AOP侧重于横切关注点(事务.日志.安全等,贯穿于多个模块的功能)小分析:OOP在横切关注点问题的不足是:1)代码混乱 2)代码分散AOP很好的解决了这个问题,并且可以很好的解决“侵入问题”. AOP的实现,必然要求对截获的对象进行代理,这个地方无…
在上一章我们看到了,新增的三种类都能实现对原始功能类进行添加功能的事务处理,这三种类就是一个代理. 但是这种代理是写死的,怎样实现对任意接口添加自定义的代理呢? 我们先来看一下之前的代理实现: public class Impeat { private InterfaceDo todo; public Impeat(InterfaceDo todo) { super(); this.todo = todo; } public void dothings() { todo.dosomething(…
一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3)用CGlib生成 代理类不需要接口 (4)用CGLib生成的代理类重写了父类的各个方法. (5)拦截器中的intercept方法内容正好就是代理类中的方法体 2.Spring什么时候使用JDK动态代理,什么时候使用CGLib动态代理? (1)若目标对象实现了若干接口,spring使用JDK的jav…
一.动态代理简介 动态代理与普通代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每个方法进行中转. 动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法.该方法就是调用被代理接口的所有方法时需要调用的,而invoke方法返回的值是被代理接口的一个实现类. 二.实例解析 接口: <span style="font-family…
说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以不用继续往下读: 1. Spring的AOP的实现方式有哪些? 2. 为什么使用动态代理? 3. 它们是怎么实现的? 4. 它们的区别是什么? 下面进入正题,Spring采用动态代理的方式实现AOP,具体采用了JDK的动态代理和CGLib的动态代理.使用动态代理的目的是在现有类的基础上增加一些功能.…
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap. Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载. …
AOP 的拦截功能是由 java 中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行.不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等). package com.itdoc.spring.aop.proxy; /** *…
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 以简单模拟事务的执行过程说明各种代理区别 1.1 静态代理 由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. ? 1 2 3 4 public interface PersonDao…
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码.动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类. 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序 java.lang.reflect.InvocationHand…
spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar { private String color = "blue"; public void run() { System.out.println("我的汽车跑起来了" + color); } } 测试 public class SpringProxy { public static void main(String[] args) { //将代理类的cl…
AOP: 原理:底层利用动态代理(两种动态代理技术都使用了) 两种实现方案: 第一种:JDK动态代理技术 实现的InvocationHandler接口,要想实现某个类的动态代理对象,必须有接口有实现类. 第二种:cglib动态代理技术(需要导入spring包--4个核心包) 实现了MethodInterceptor接口,原理是继承要代理的类. 第一步:导入包  4+2+2+2 第二步:准备肉鸡 编写一个接口UserService  和 UserServiceImpl,具体详见代码 第三步:编写通…
开心一刻 女孩睡醒玩手机,收到男孩发来一条信息:我要去跟我喜欢的人表白了! 女孩的心猛的一痛,回了条信息:去吧,祝你好运! 男孩回了句:但是我没有勇气说不来,怕被打! 女孩:没事的,我相信你!此时女孩已经伤心的流泪了 男孩:我已经到她家门口了,不敢敲门! 女孩擦了擦眼泪:不用怕,你是个好人,会有好报的! 男孩:那你来开下门吧,我在你家门口! 女孩不敢相信,赶紧跑去开门,看到他的那一刻伤心的泪水变成了感动 男孩拿出手里那束玫瑰花说:你姐姐在家吗? 前情回归 一般来讲,读写分离无非两种实现方式.第一…
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1.14.RELEASE 在开始阅读 Spring AOP 源码之前,需要对 Spring IoC 有一定的了解,可查看我的 <死磕Spring之IoC篇 - 文章导读> 这一系列文章 了解 AOP 相关术语,可先查看 <Spring AOP 常见面试题) > 这篇文章 该系列其他文章请…
前言 上一篇文章中提到了SpringAOP是如何决断使用哪种动态代理方式的,本文接上文讲解SpringAOP的JDK动态代理是如何实现的.SpringAOP的实现其实也是使用了Proxy和InvocationHandler这两个东西的. JDK动态代理的使用方式 首先对于InvocationHandler的创建是最为核心的,可以自定义类实现它.实现后需要重写3个函数: 构造函数,将代理的对象闯入 invoke方法,此方法中实现了AOP增强的所有逻辑 getProxy方法,此方法千篇一律,但是必不…
AOP AOP是指在jvm运行时, 动态将代码切入到指定位置. OOP是一个维度上写代码, AOP是把他切开来, 变成立体的. 这样的好处是: 业务逻辑跟辅助逻辑分离, 例如日志打印, 性能监控, 安全控制等等, 代码不会搞的很冗余. 跟filter的区别有什么区别呢, 看上去filter也可以做上述事情, 有请求才会filter, filter也无法更细粒度的控制. 如何切开程序? 答: 通过修改字节码. 之前设计器那边用过AspectJ来实现静态的修改class切入, 这种其实不算动态修改.…
上一篇介绍了几种Advice(增强),并通过代码演示了生成代理的方式,下面来看通过配置文件配置方式把Advice织入目标类. 注意,配置文件方式仍然不是spring AOP的最好方式,学习配置方式也是为了循序渐进的掌握内核技术. 接口SmartCar public interface SmartCar { void lock(String userName); } 实现类MyCar public class MyCar implements SmartCar { @Override public…
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 何为动态代理,就不扯皮了,上一篇博客刚刚提到,那cglib动态代理又怎么写,我拿个和上个例子相似的案例来写 具体案例: 一个SomeServiceImpl接口 package cn.dawn.day10cglibdtproxy; /** * Created by Dawn on 2018/3/8. */ public class SomeServiceImpl { public void doSome()…
软件151 李飞瑶 一.SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只做非核心业务.  ⒉目的: ⑴.把核心业务和非核心业务进行分离  ⑵.把多个非核心业务处理(点)变成一个切面(之前的非核心业务代码需要写多次变成只需要写一次.) ⒊要求:只有当核心类中有多个业务需要进行处理的时候使用AOP较为合理,如果只有一个业务需要被处理那么就没有必要使用AOP了. 二.静态代理…
先说一下代理模式的好处 1.可以使真实角色的操作更加纯粹,不用去关注一些公共的业务 2.公共的交给代理角色,实现了业务的分工 3.公共业务发生扩展的时候,方便集中管理 静态代理模式的缺点 1.一个真实角色就会产生一个代理角色 2.代码量翻倍,开发效率低 动态代理的分类: 1.基于接口的动态代理:JDK动态代理(本文章使用此方式) 2.基于类的动态代理:cglib 动态代理实现的基本条件 需要了解JDK的两个类: InvocationHandler:调用处理程序 InvocationHandler…
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- JDK动态代理: 为何叫JDK动态代理呢? 所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的api 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 何为动态?相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获…
我们常常会遇到这样的事,项目经理让你为一个功能类再加一个功能A,然后你加班为这个类加上了功能A: 过了两天又来了新需求,再在A功能后面加上一个新功能B,你加班写好了这个功能B,加在了A后面:又过 了几天天,项目经理说这两个新加的功能顺序需要调换一下,然后你找到一个礼拜之前的写的源代码,看了 一遍想起来当时是怎么实现的了,这部分是功能A,那部分是功能B,然后巴拉巴拉换了顺序.看到这是不是 觉得很烦,动不动就要在源码上加新功能,完了又要在源码上换新功能的顺序,那么一大坨源码,还好是自 己写的源码,理…
    Spring为我们提供了自动代理机制,让容器为我们自动生成代理,把我们从烦琐的配置工作中解放出来,在内部,Spring 使用BeanPostProcessor自动地完成这项工作.   1.实现类介绍     这些基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理实例.     1)基于Bean配置名规则的自动代理创建器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAuto…