cglib

JDK代理和Cglib

故事扮演 提交于 2020-03-03 23:27:15
概念 首先需要描述一下代理模式的概念,什么是代理模式: 代理模式就是在访问对象时引入一定的间接性。 比如不直接调用实际对象的方法,这样在这个代理的过程中我们就可以加上一些其他的用途。 静态代理和动态代理 动态代理和静态代理的区别很大,静态代理的类是我们自己定义好的,在程序运行之间就已经变异完成,但是动态代理是我们在程序运行时创建的。 动态代理的优势在于我们可以很方便的对代理类的函数进行统一处理,而不用修改每个代理类中的方法。 网上有一段很好理解的代码片段: public class StuInvocationHandler<T> implements InvocationHandler { //invocationHandler持有的被代理对象 T target; public StuInvocationHandler(T target) { this.target = target; } /** * proxy:代表动态代理对象 * method:代表正在执行的方法 * args:代表调用目标方法时传入的实参 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理执行" +method.getName() + "方法"

Eclipse

杀马特。学长 韩版系。学妹 提交于 2020-03-02 22:21:23
我在尝试设置断点时在Eclipse中遇到这个奇怪的错误。 Unable to insert breakpoint Absent Line Number Information 我勾选了编译器选项中的复选框,但没有运气。 #1楼 这对我有用: 在 Window --> Preferences --> Java --> Compiler --> Classfile Generation ,所有选项都必须为 True 。 在build.xml <javac> 任务中使 debug="true" 。 通过ant生成的战争在tomcat中部署应用程序 在 Debug 模式下重新启动Tomcat #2楼 当我在jetty服务器上制作并通过ANT编译新的.war文件时,我遇到了同样的问题。 在必须像之前编写的那样设置Java Compiler之后,您应该制作相同版本的jdk / jre编译器和构建路径(例如jdk 1.6v33,jdk 1.7,....)。 我做了一切,仍然没有工作。 解决方案是删除已编译的.class文件和生成的war文件的目标,现在它的工作:) #3楼 在eclipse菜单中,转到Window-> Preferences-> Java-> Compiler 取消标记复选框“添加行号属性...” 单击应用 - >是 选中“添加行号属性...”复选框 再次申请。 快乐的调试

Java动态代理的两种实现方法

女生的网名这么多〃 提交于 2020-03-02 08:56:41
AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。 那么动态代理是如何实现将切面逻辑(advise)织入到目标类方法中去的呢?下面我们就来详细介绍并实现AOP中用到的两种动态代理。 AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由 Java 内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。。 1、定义接口和实现 package com

Java动态代理与CGLIB

北城余情 提交于 2020-03-02 03:07:09
1. 静态代理模式 因为需要对一些函数进行二次处理,或是某些函数不让外界知道时,可以使用代理模式,通过访问第三方,间接访问原函数的方式,达到以上目的,来看一下代理模式的类图: interface Hosee{ String sayhi(); } class Hoseeimpl implements Hosee{ @Override public String sayhi() { return "Welcome oschina hosee's blog"; } } class HoseeProxy implements Hosee{ Hosee h; public HoseeProxy(Hosee h) { this.h = h; } @Override public String sayhi() { System.out.println("I'm proxy!"); return h.sayhi(); } } public class StaticProxy { public static void main(String[] args) { Hoseeimpl h = new Hoseeimpl(); HoseeProxy hp = new HoseeProxy(h); System.out.println(hp.sayhi()); } } 1.1 静态代理的弊端

【Spring源代码阅读之七】执行postProcessBeanFactory方法对@Configuration配置类的@Bean方法进行CGLIB代理增强

允我心安 提交于 2020-03-01 01:49:52
执行ConfigurationClassPostProcessor#postProcessBeanFactory方法对@Configuration配置类的@Bean方法进行CGLIB代理增强 导图 在哪调用到这里的 ConfigurationClassPostProcessor#postProcessBeanFactory enhanceConfigurationClasses ConfigurationClassEnhancer#enhance newEnhancer CALLBACK_FILTER ConfigurationClassEnhancer.BeanMethodInterceptor BeanMethodInterceptor#intercept BeanAnnotationHelper#determineBeanNameFor isCurrentlyInvokedFactoryMethod resolveBeanReference ConfigurationClassEnhancer.BeanFactoryAwareMethodInterceptor createClass 导图 在哪调用到这里的 ConfigurationClassPostProcessor#postProcessBeanFactory /** * 使用CGLIB代理增强

java反射与代理

馋奶兔 提交于 2020-02-29 07:52:21
Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC、AOP就是通过反射机制与动态代理实现的。 1 Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod(),或者遍历修改可访问性 Method method = cls.getMethod("getTime5Flag"); String res1 = (String) method.invoke(user); System.out.println(res1); //涉及到基本类型如int,则使用int.class!Integer.class!=int.class! method = cls.getMethod("setTime5Flag", String.class); method.invoke(user, "Rollen"); method = cls.getMethod("getTime5Flag"); String res2 = (String) method.invoke(user); System.out.println(res2);

Spring AOP原理

我的未来我决定 提交于 2020-02-29 00:30:52
ProxyFacotryBean是FacotryBean的一种实现,FacotryBean要产生bean都要重写getObject方法,而ProxyFacotryBean这里的这个getObject正是为代理做了准备并返回代理对象。首先用initializeAdvisorChain(第一次去取代理对象时初始化一遍)初始化Advisor链后对于singleton和prototype进行区分生成对应的proxy。 1、初始化Advisor链 initializeAdvisorChain初始化Advisor链是遍历ProxyFacotryBean中配置的interceptorNames,如果结尾有通配符只能是ListableBeanFacotory来加载否则报错,去掉结尾通配符*后调用addGlobalAdvosor(这个是获取ListableBeanFacotory的所有globalAdvisorNames和globalInterceptorNames,分别遍历用getBean(beanName)获取advice,把其中符合通配符格式的advice调用addAdvisorOnChainCreation封装成advicsor后添加到Advisor链

Spring Proxy 动态代理(ProxyFactory)

二次信任 提交于 2020-02-28 23:47:32
一、动态代理生成技术栈分为两种: 1、JDK动态代理 JDK动态代理只能对实现了接口的类生成代理,而不能针对类 2、Cglib动态代理 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承) 二、Spring在选择用JDK还是CGLiB的依据: (1)当Bean实现接口时,Spring就会用JDK的动态代理 (2)当Bean没有实现接口时,Spring使用CGlib是实现 (3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>) 三、CGlib比JDK快?   (1)使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。   (2)在对JDK动态代理与CGlib动态代理的代码实验中看,1W次执行下,JDK7及8的动态代理性能比CGlib要好20%左右。 四、Spring 动态代理如何封装的; 来源: https://www.cnblogs.com/wangwei1986/p/9377504.html

SpringAOP实现(原理)

只谈情不闲聊 提交于 2020-02-28 18:18:31
AOP原理: AOP分为:JDK动态代理和CGLIB代理 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 注意: 目标代理类不能是final 字段、方法、类 动态代理:在程序运行时,运用反射机制动态创建而成。 JDK动态代理实现:必须有接口和实现类 ?疑问:为什么必须是接口和实现类,既然核心是反射,普通的java也是可以通过反射实现注入,为什么必须是接口及实现类 UserService : package com.gillion.aop; /** * * @Description 目标接口 * @author huyuangui@aliyun.com * @time 2015年1月9日 下午2:28:00 * @version 1.0.0 */ public interface UserService { /** * 根据ID删除用户 * @param id * @return */ public String deleteUser(String id); } UserService实现类 : package com.gillion.aop.impl; import com.gillion.aop.UserService; /** * @Description UserService实现类 * @author

Spring AOP 创建增强类

此生再无相见时 提交于 2020-02-28 10:24:39
AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强: 1)前置增强: org.springframework.aop.BeforeAdvice 代表前置增强,因为Spring 只支持方法级的增强,所有MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定义的; 2)后置增强: org.springframework.aop.AfterReturningAdvice 代表后增强,表示在目标方法执行后实施增强; 3)环绕增强: org.aopalliance.intercept.MethodInterceptor 代表环绕增强,表示在目标方法执行前后实施增强; 4)异常抛出增强: org.springframework.aop.ThrowsAdvice 代表抛出异常增强,表示在目标方法抛出异常后实施增强; 5)引介增强: org.springframework.aop.IntroductionInterceptor 代表引介增强,表示在目标类中添加一些新的方法和属性。 1、前置增强 模拟服务员向顾客表示欢迎和对顾客提供服务。 Waiter接口: package com.yyq.advice; public interface Waiter {