动态代理

动态代理之 CGLIB 动态代理

我只是一个虾纸丫 提交于 2020-01-09 22:45:52
CGLIB 动态代理 之前我们详细介绍了 JDK 自身的 API 所提供的动态代理的实现,也说明了它存在的缺陷,那就是只能为接口中的方法做代理,被代理类自身和父类的方法都不能被代理。 CGLIB 就是为了解决这个问题而生的,高新能的,底层基于 ASM 框架的一个代码生成框架,它完美的解决了 JDK 版本的动态代理只能为接口中的方法做代理的问题。 例子 我们还是先来看一个例子。首先定义一个 Person 接口,它能够讲话和跑步,在定一个一个 Father 类,它定义了一个 sayHello 方法。 public class Father{ public void sayHello(){ System.out.println("hi somebody...."); } } public interface Person{ void speak(); void run(); } 下面是我们的被代理类,它本身继承自 Father 类,并且实现 Person 接口。 public class Student extends Father implements Person{ // student 类自己实现的方法 public void study(){ System.out.println("i can study...."); } @Override public void speak(

SpringBoot : 定制化Bean的利器:BeanPostProcessor & BeanFactoryPostProcessor

梦想与她 提交于 2020-01-09 13:57:14
1.美图 2.概述 Spring的面试中,一般都会问到IOC和AOP,大部分同学都能回答出这些知识点的基本运用,如果再多问一句,AOP的底层实现方式,大部分人都会回答动态代理。那么动态代理是如何被使用到Bean上的呢?到这里可能要刷掉一大部分人,如果没有看过Spring的源码的话,这个是比较难回答的。 实际就是今天要了解的BeanPostProcessor,这是一个比较神奇的接口,实现AOP功能主要就是依靠这个接口。 在Spring官方文档中,这两个知识点被当做扩展知识点来介绍的。 3.BeanPostProcessor 3.1 定义 该接口定义了两个回调方法用于用户实现,我们可以在里面定义一系列的实现。 public interface BeanPostProcessor { Object postProcessBeforeInitialization ( Object bean , String beanName ) throws BeansException ; Object postProcessAfterInitialization ( Object bean , String beanName ) throws BeansException ; } 如果我们自定义了BeanPostProcessor的实现,并注册到容器中,则bean的加载过程中,相关方法的调用顺序为:

Java 9.Spring--AOP

浪尽此生 提交于 2020-01-09 10:35:02
1.AOP 面向切面 AOP思想 : 横向重复,纵向抽取 2.底层思实现 Spring的AOP的底层用到两种代理机制 JDK的动态代理 Cglib的动态代理 3.AOP的开发中的相关术语 Joinpoint(连接点) Pointcut(切入点) Advice(通知、增强) Introduction(引介) Aspect(切面) Target(目标对象) Proxy(代理) Weaving(织入) 来源: https://www.cnblogs.com/yuzhenfu/p/12169646.html

代理模式之动态代理InvocationHandler

本秂侑毒 提交于 2020-01-08 21:05:48
本文转自 http://paddy-w.iteye.com/blog/841798 Java中动态代理的实现,关键就是这两个东西:Proxy、InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的。 首先,invoke方法的完整形式如下: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { method.invoke(obj, args); return null; }    首先猜测一下,method是调用的方法,即需要执行的方法;args是方法的参数;proxy,这个参数是什么?以上invoke()方法的实现即是比较标准的形式,我们看到,这里并没有用到proxy参数。查看JDK文档中Proxy的说明,如下: Java代码 A method invocation on a proxy instance through one of its proxy interfaces will be dispatched to the invoke method of the instance's invocation handler, passing the proxy instance

xml文件的方式实现动态代理基于SpringAOP

自闭症网瘾萝莉.ら 提交于 2020-01-08 12:46:53
1.配置spring容器 导入jar包        com.springsource.net.sf.cglib-2.2.0.jar     com.springsource.org.aopalliance-1.0.0.jar     com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar     commons-logging-1.1.3.jar     spring-aop-4.2.2.RELEASE.jar     spring-beans-4.2.2.RELEASE.jar     spring-context-4.2.2.RELEASE.jar     spring-core-4.2.2.RELEASE.jar     spring-expression-4.2.2.RELEASE.jar 配置xml文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5

Java的动态代理

冷暖自知 提交于 2020-01-08 06:29:35
什么是动态代理(dynamic proxy) 动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时 创建一个实现某些给定接口的新类 (也称“动态代理类”)及其实例(对象) (Using Java Reflection to create dynamic implementations of interfaces at runtime)。 代理的是接口(Interfaces),不是类(Class),更不是抽象类。 动态代理有什么用 解决特定问题:一个接口的实现在编译时无法知道,需要在运行时才能实现 实现某些设计模式:适配器(Adapter)或修饰器(Decorator) 面向切面编程:如AOP in Spring 创建动态代理 利用Java的Proxy类,调用Proxy.newProxyInstance(),创建动态对象十分简单。 InvocationHandler handler = new MyInvocationHandler(...); Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class }); Foo f = (Foo) proxyClass. getConstructor(new Class[] {

Spring AOP实现原理-动态代理

荒凉一梦 提交于 2020-01-08 04:26:18
目录 代理模式 静态代理 动态代理 代理模式 我们知道,Spring AOP的主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么Spring AOP的底层如何实现对方法的增强?实现的关键在于使用了代理模式 代理模式的作用就是为其它对象提供一种代理,以控制对这个对象的访问,用于解决在直接访问对象时带来的各种问题。 代理主要分为两种方式:静态代理和动态代理 静态代理 静态代理主要通过将目标类与代理类实现同一个接口,让代理类持有真实类对象,然后在代理类方法中调用真实类方法,在调用真实类方法的前后添加我们所需要的功能扩展代码来达到增强的目的 示例代码: /** * 代理类与目标类的共同接口 */ public interface Subject { void request(); void response(); } /** * 目标类 */ public class RealSubject implements Subject { @Override public void request() { System.out.println("执行目标对象的request方法......"); } @Override public void response() { System.out.println("执行目标对象的response方法......"); }

Spring知识点小结

≯℡__Kan透↙ 提交于 2020-01-07 13:52:00
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring AOP:AOP服务; Spring Context:提供框架式的Bean访问方式; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? spring属于低侵入式设计,代码的污染极低; spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 spring对于主流的应用框架提供了集成支持。 3.Spring的AOP理解: AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”

静态代理和动态代理的理解

谁说我不能喝 提交于 2020-01-07 08:36:47
1、静态代理 代码参考: https://blog.csdn.net/dcxmaozi/article/details/99852198 https://www.cnblogs.com/djoker/p/6242047.html https://segmentfault.com/a/1190000019355525 我对于静态代理的理解,这样可能更容易让人理解 角色:我(被代理类),中介人员(代理类),房地产商 情景一:正常情况下,我是可以直接找房地产商买房的,我只需要将我和房地产商之间的手续办好就行了,比如说签个合同, 这里就相当于用户管理实现类直接执行add()方法 情景二:由于房地产商房子太多,他会通过中介人员卖房子,而我就需要找中介人员买房子。这个时候买房的时候就需要多一些中介手续。 这里就相当于通过代理类,为add()方法多了些日志操作的手续 问题出现了,如果买房的人(被代理类)特别多,但是所有的中介人员(代理类)经手的手续也都是一样的,那么为每个买房的人(被代理类)都提供一个中介人员(代理类),对中介所来说无疑成本增大了,所以应该培训中介人员,一人可以为多个买房的人办理相关业务,也就引出了动态代理的概念。 来源: CSDN 作者: Sunlalalla 链接: https://blog.csdn.net/Sun_of_Rainy/article/details

代理模式

二次信任 提交于 2020-01-07 01:39:58
代理模式的分类: 静态代理 动态代理 ------------------------------------------------------------------------------------------------------------------- 静态代理 代码步骤: 接口(提取关键方法) 真实角色(原本的实现对象) 代理角色(扩展功能) 客户端访问代理角色(方法增强的结果) 1 //租房 2 public interface Rent { 3 void rent(); 4 } 1 //真实角色 房东 2 public class Host implements Rent { 3 public void rent() { 4 System.out.println("房东出租房子"); 5 } 6 } 1 //代理角色房屋中介 2 public class proxy implements Rent { 3 private Host host; 4 5 public proxy(){ 6 7 } 8 public proxy(Host host){ 9 this.host= host; 10 } 11 12 public void rent() { 13 host.rent(); 14 seeHouses(); 15 hetong(); 16 fare();