cglib

你必须会的 JDK 动态代理和 CGLIB 动态代理

邮差的信 提交于 2020-04-06 15:52:30
我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性。 通过从静态代理、JDK 动态代理、CGLIB 动态代理来进行本文的分析。 静态代理 静态代理就是在程序运行之前,代理类字节码 .class 就已编译好,通常一个静态代理类也只代理一个目标类,代理类和目标类都实现相同的接口。 接下来就先通过 demo 进行分析什么是静态代理,当前创建一个 Animal 接口,里面包含 call 函数。 package top.ytao.demo.proxy; /** * Created by YangTao */ public interface Animal { void call(); } 创建目标类 Cat,同时实现 Animal 接口,下面是 Cat 发出叫声的实现。 package top.ytao.demo.proxy; /** * Created by YangTao */ public class Cat implements Animal { @Override public void call() { System.out.println("喵喵喵 ~"); } } 由于 Cat 叫之前是因为肚子饿了,所以我们需要在目标对象方法 Cat#call 之前说明是饥饿

Spring IOC 和 AOP 的核心思想

点点圈 提交于 2020-04-06 09:36:50
IOC 和 AOP 是Spring的两大核心思想,那么这种技术的实现方式和核心思将又是什么呢? 首先,我们知道Spring是一个分层的轻量级开源框架,大量的配置文件是不可缺少的,但是其核心是要把这些配置文件给组合起来,并将核心代码与业务代码剥离开来. 一 、Spring IOC (控制反转) IOC (即 Inversion of Control )为控制反转.Spring开发的基本思想 : 采用面向接口的编程模式.框架做到越多,就越有体会接口在起中起的作用,而Spring将这一想法,开始贯彻到业务的开发中.Bean的Set方法使用接口作为参数,保证其扩展性,实现依赖关系的解耦合.所谓的控制反转,也可以理解为依赖注入, IOC容器 就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及监理这些对象间的依赖.程序将无需直接在代码中new相关对象,程序将由IOC容器进行组装. 简单点说,就是将创建对象的控制权,被反转到了Spring框架上. 通常,我们实例化一个对象时,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就把new对象的工交给了Spring容器。 IOC主要实现方式有两种 : 依赖查找 、 依赖注入 . 依赖注入是一种更可取的方式. 依赖查找 ,主要是容器为组件提供一个回调接口和上下文环境。这样一来

代理

瘦欲@ 提交于 2020-04-06 02:17:46
动态代理 //接口类 public interface PersonBehavior { void talk () ; void jump () ; } //实现类(被代理类) public class DefaultPersonBehavior implements PersonBehavior { @Override public void talk () { System. out .println( "We can talk" ) ; } @Override public void jump () { System. out .println( "We can jump" ) ; } } public class PersonBehaviorHandler implements InvocationHandler { private Object target ; public PersonBehaviorHandler (Object target) { this . target = target ; } @Override public Object invoke (Object proxy , Method method , Object[] args) throws Throwable { System. out .println( "We can do

Spring IOC和AOP理解,以及怎么解决循环依赖

送分小仙女□ 提交于 2020-04-05 19:58:16
IOC IOC,控制反转(Inversion of Control) ,就是把对象的创建(即bean的new操作),交给Spring来实现。 通过XML配置:bean标签是用于配置被spring容器管理的bean信息,我们可以通过bean标签,完成IOC的配置。 使用默认无参构造函数来创建类对象,并存入spring容器 < bean id ="userService" class ="com.xcj.spring.service.UserServiceImpl" ></ bean > public class UserServiceImpl implements UserService { } 静态工厂方式 <!-- 使用StaticFactory类中的静态方法createDemoService创建对象,并存入spring容器(简单了解下,实际中基本不用) --> < bean id ="demoService" class ="com.xcj.spring.factory.StaticFactory" factory-method ="createDemoService" ></ bean > public class StaticFactory { public static DemoService createDemoService() { return new

代理模式

十年热恋 提交于 2020-04-05 16:46:07
代理模式 (Proxy Pattern)是只为其他对象提供一种代理,以控制对这个对象的访问,属于结构行模式。 代理模式一般包含三种角色: 抽象主题角色:抽象主题类的主要职责是声明真实主题与代理的共同接口方法,该类可以是接口也可以说抽象类。 真实主题角色:该类被称为代理类,该类定义了代理所表示的真实对象,是负责执行系统真正逻辑业务对象。 代理主角色:也被称为代理类;其内部持有(真实主题角色)的引用,因此具备完全的对(真实主题角色)的代理权。客户端调用代理对象方法,同时也调用了代理类方法,但是会在代理类对象前后增加一些处理代码。 优点: 1、代理模式能将代理对象与真实被调用目标对象分离。 2、在一定程度上降低了系统的耦合性,扩展性好。 3、可以起到保护目标对象的作用。 4、可以增强目标对象的功能。 缺点: 1、代理模式会造成系统设计中类的数量增加。 2、在客户端和目标对象中增加一个代理对象,会导致请求处理速度变慢。 3、增加了系统的复杂度。 应用场景:系统日志、事物代理、springAopd等。 静态代理: 静态代理只能通过手动完成代理操作,如果被代理类增加了新的方法,代理类需同步增加,违背开闭原则。 代码示例: (静态代理只负责自己代理的;如下只能代理售票,如新增一个售卖其他的类无法代理) //售票接口(抽象主题角色) public interface ITicketSales {

Spring Boot实践——AOP实现

随声附和 提交于 2020-04-01 07:56:45
Spring AOP 介绍   AOP的介绍可以查看 Spring Boot实践——AOP实现   与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。   Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是 InvocationHandler 接口和 Proxy 类。   如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,是利用asm开源包, 可以在运行时动态的生成某个类的子类 。注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为 final ,那么它是无法使用CGLIB做动态代理的。   这里有注意的几点如下: 从Spring 3.2以后不再将CGLIB放在项目的classpath下,而是将CGLIB类打包放在spring-core下面的org.springframework中

Spring框架搭建遇到的问题汇总

风格不统一 提交于 2020-03-30 21:20:18
1、The resource is not on the build path of a Java project   然后把相应的依赖加入构建路径 2、Type mismatch: cannot convert from Class<SpringJUnit4ClassRunner> to Class<? extends Runner>   版本过低,spring不支持junit4.5以下的。 3、No grammar constraints (DTD or XML schema) detected for the document   警告,没关系 4、java.lang.IllegalStateException: Failed to load ApplicationContext ested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans' http://www.springframework.org/schema/context/spring-context-3.0.xsd schema写成了 scheme 5、java.lang.ClassNotFoundException: org.aopalliance

spring框架基础知识

走远了吗. 提交于 2020-03-27 17:10:08
3 月,跳不动了?>>> 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的AOP理解 : AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。 AOP实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理

详解 Java 中的三种代理模式!

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

AOP的底层实现-CGLIB动态代理和JDK动态代理

大城市里の小女人 提交于 2020-03-27 14:48:57
AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础。它是一种面向切面编程的思想。关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来讲解下AOP的核心功能的底层实现机制:如何用动态代理来实现切面拦截。 AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。 那么动态代理是如何实现将切面逻辑(advise)织入到目标类方法中去的呢?下面我们就来详细介绍并实现AOP中用到的两种动态代理。 AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意