aop动态代理源码分析

package org.springframework.aop.framework;
import java.io.Serializable;import java.lang.reflect.Proxy;

import org.springframework.aop.SpringProxy;

@SuppressWarnings("serial")public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {    //动态代理方法   @Override   public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {      if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {         Class<?> targetClass = config.getTargetClass();         if (targetClass == null) {            throw new AopConfigException("TargetSource cannot determine target class: " +                  "Either an interface or a target is required for proxy creation.");         }         if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {            return new JdkDynamicAopProxy(config);         }         return new ObjenesisCglibAopProxy(config);      }      else {         return new JdkDynamicAopProxy(config);      }   }

   private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {      Class<?>[] ifcs = config.getProxiedInterfaces();      return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));   }

}
config.isOptimize()-------------------------------------------------是否进行优化,默认是falseconfig.isProxyTargetClass()-----------------------------------------是否强制使用cglib代理。但它为true也不是肯定就采用cglib,因为下面还有一个判断条件,即目标类是接口,则使用jdk动态代理的方式。hasNoUserSuppliedProxyInterfaces(config)----------------------------目标类没有实现接口,或者有但是是接口类型是SpringProxy

当config.isOptimize(),config.isProxyTargetClass(),hasNoUserSuppliedProxyInterfaces(config)全部为false时候使用JDK动态代理JdkDynamicAopProxy
当config.isOptimize(),config.isProxyTargetClass(),hasNoUserSuppliedProxyInterfaces(config)有一个为true,且代理对象不为接口时或者配置注解
@EnableAspectJAutoProxy(proxyTargetClass = true),使用cglib动态代理

原文地址:https://www.cnblogs.com/WQLLL/p/11073388.html

时间: 2024-10-18 14:30:33

aop动态代理源码分析的相关文章

java 1.8 动态代理源码分析

JDK8动态代理源码分析 动态代理的基本使用就不详细介绍了: 例子: class proxyed implements pro{ @Override public void text() { System.err.println("本方法"); } } interface pro { void text(); } public class JavaProxy implements InvocationHandler { private Object source; public Jav

JDK动态代理源码分析

先抛出一个问题,JDK的动态代理为什么不支持对实现类的代理,只支持接口的代理??? 首先来看一下如何使用JDK动态代理.JDK提供了Java.lang.reflect.Proxy类来实现动态代理的,可通过它的newProxyInstance来获得代理实现类.同时对于代理的接口的实际处理,是一个java.lang.reflect.InvocationHandler,它提供了一个invoke方法供实现者提供相应的代理逻辑的实现. 下面实现一个jdk动态代理的例子: 1.被代理的接口,编写一个接口He

设计模式之JDK动态代理源码分析

这里查看JDK1.8.0_65的源码,通过debug学习JDK动态代理的实现原理 大概流程 1.为接口创建代理类的字节码文件 2.使用ClassLoader将字节码文件加载到JVM 3.创建代理类实例对象,执行对象的目标方法 动态代理涉及到的主要类: java.lang.reflect.Proxyjava.lang.reflect.InvocationHandlerjava.lang.reflect.WeakCachesun.misc.ProxyGenerator 首先看Proxy类中的newP

java动态代理源码解析

众所周知,java动态代理同反射原理一直是许多框架的底层实现,之前一直没有时间来分析动态代理的底层源码,现结合源码分析一下动态代理的底层实现 类和接口 java动态代理的主要类和接口有:java.lang.reflect.Proxy.java.lang.reflect.InvocationHandler 1 java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对象和代理类. 1.public static InvocationHandler g

jdk的动态代理源码解析

先看一下JDK的动态是怎么用的. Java代码   package dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 实现自己的InvocationHandler * @author zyb * @since 2012-8-9 * */ public class MyInvocationH

jdk动态代理源码学习

最近用到了java的动态代理,虽然会用,但不了解他具体是怎么实现,抽空看看了看他的源码. 说到Java的动态代理就不能不说到代理模式,动态代理也就是多了一个’动态’两字,在<大话设计模式>中不是有这句话吗?“反射,反射程序员的快乐”,这里也不例外,他在底层也是使用了反射来创建对象. 一. 为了让我们更加明白的了解动态代理,我们先来复习一下代理模式吧(没有学过的,也得假装复习是复习呀,不然掉面). public interface BookManager { void addBook(); }

JDK动态代理源码剖析

关键代码: 1.Proxy.newInstance: private static final Class<?>[] constructorParams = { InvocationHandler.class }; Class<?> cl = getProxyClass0(loader, intfs); final Constructor<?> cons = cl.getConstructor(constructorParams); return cons.newIns

c#换ip代理源码

很多朋友都想如何提高自己的网站流量,可是都没有什么好的办法 经过很长时间的研究,在C#中实现了,当然了,这部分代码其中一部分是网上的,不是原创. using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; u

Spring AOP介绍及源码分析

一.AOP介绍 举个例子来说明一下吧!现在系统中有很多的业务方法,如上传产品信息.修改产品信息.发布公司库等:现在需要对这些方法的执行做性能监控,看每个业务方法的执行时间:在不改变原业务代码的基础上,也许我们会这么做: Offer接口: Offer实现: Offer代理: 我们要通过下面的方式来使用: 上面的例子的输出为: 上面的例子中,OfferProxy实现了IOffer,而所有的业务实现均委托给其成员offer:可以想像,这应该就是最简单的AOP的实现了:但这种方式会存在一个问题:如果有非