ProxyFactory在Springaop中占有举足轻重的地位,用来间接创建代理,如下List-1所示,我们给ServiceImpl创建代理。 ; public class AopTest { @Test public void test(){ ProxyFactory proxyFactory = new ProxyFactory (); proxyFactory.setInterfaces(IService.class); proxyFactory.setTarget(new ServiceImpl ()); proxyFactory.addAdvice(new BeforeAdvice()); proxyFactory.addAdvice(new AfterAdvice createAopProxy方法里面把this传入,ProxyFactory实现了AdvisedSupport,所以在createAopProxy时将ProxyFactory中设置的targetSource
几个重要的API: ProxyFactory MethodInterceptor Advice AfterReturningAdvice MethodBeforeAdvice import java.lang.reflect.Method Class[] interfaces=new Class[]{HelloWorldService.class}; //利用spring的API,创建代理工厂 ProxyFactory proxyFactory=new ProxyFactory(interfaces); //设置目标对象 proxyFactory.setTarget(new HelloWorldServiceImpl * */ proxyFactory.setOpaque(true); //添加方法前置通知 proxyFactory.addAdvice (proxyFactory.getClass().getClassLoader()); Class[] inters=proxy.getClass().getInterfaces();
1.ProxyFactory getProxy()方法,依据我们对Proxy属性的设置,生成JdkDynamicAopProxy或者CglibAopProxy,我们这里分析JdkDynamicAopProxy org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor 2.ProxyFactoryBean ProxyFactoryBean不同于ProxyFactory 步骤14,我们在调用被代理对象的方法时,调用的是JdkDynamicAopProxy的invoke(),之后的操作就和ProxyFactory的一样了,看上面ProxyFactory的分析。
> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, url); 这里的proxyFactory是在ServiceConfig 如下: private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class ).getAdaptiveExtension(); proxyFactory通过ExtensionLoader拓展机制进行加载。 查看ProxyFactory接口源码如下: package com.alibaba.dubbo.rpc; import com.alibaba.dubbo.common.Constants; import 其中getInvoker方法是在ProxyFactory接口中定义的,用于创建Invoker。getInvoker中代码很简单,直接返回一个匿名类。
源码深入 Spring ProxyFactory 看下面这幅图: 来源:http://images2015.cnblogs.com/blog/639520/201611/639520-20161129113959240 -514594219.png ProxyFactory集AopProxy和AdvisedSupport于一身,所以,可以通过ProxyFactory设置生成代理对象所需要的相关信息(AdvisedSupport 的职责),也可以通过ProxyFactory取得最终生成的代理对象(AopProxy的职责)。
Spring读源码系列之AOP--04---proxyFactory创建代理对象 引言 ProxyCreatorSupport---代理对象创建支持 AopProxyFactory---生产AopProxy 它和Spring容器没啥关系,可议直接创建代理来使用: public class ProxyFactory extends ProxyCreatorSupport { public ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTargetSource(targetSource); //采用cglib代理 proxyFactory.setProxyTargetClass (true); return proxyFactory.getProxy(); } } 该类提供了一个更加便捷的方法来创建代理对象,并且不需要依赖IOC ---- ProxyFactory使用演示 public static void main(String[] args) { ProxyFactory proxyFactory = new ProxyFactory(new
) { ProxyFactory proxyFactory = new ProxyFactory(new HelloServiceImpl()); // 添加两个Advise public class ProxyFactory extends ProxyCreatorSupport { // 它提供了丰富的构造函数~~~ public ProxyFactory() { (target)); } public ProxyFactory(Class<? proxyFactory = new ProxyFactory(); proxyFactory.setTargetSource(targetSource); proxyFactory.setProxyTargetClass (true); return proxyFactory.getProxy(); } } 原理 由源代码可议看出,ProxyFactory的原理就是ProxyCreatorSupport#createAopProxy
1.1 基于JDK动态代理 public static void main(String[] args) { ProxyFactory proxyFactory = new ProxyFactory (); proxyFactory.setInterfaces(CustomPrintService.class); proxyFactory.setTargetSource(new SingletonTargetSource 内部维护了一个interfaces列表,后期所生成的代理类将实现这些接口; // 当向ProxyFactory注册IntroductionAdvisor时,会通过IntroductionAdvisor proxyFactory = new ProxyFactory(); proxyFactory.setTargetSource(new SingletonTargetSource(new CustomPrintServiceImpl 内部维护了一个interfaces列表,后期所生成的代理类将实现这些接口; // 当向ProxyFactory注册IntroductionAdvisor时,会通过IntroductionAdvisor
proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); //proxyTargetClass是 @EnableAspectJAutoProxy proxyFactory.setProxyTargetClass(true); } else { //检测 beanClass 是否实现了接口,若未实现,则将 //proxyFactory //封装proxyFactory Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); proxyFactory.addAdvisors (advisors); proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); proxyFactory.setFrozen return proxyFactory.getProxy(getProxyClassLoader()); } 这里我们主要看下核心逻辑: 创建代理工厂 ProxyFactory 判断使用JDK还是
ProxyFactoryBean AspectJProxyFactory Spring提供了以上三个代理工厂类,ProxyFactory是针对target=类的创建工厂,ProxyFactoryBean ProxyFactory的使用方式,代理目标是普通Class对象 class TargetClass { public void sayHello() { System.out.println proxyFactory = new ProxyFactory(); // 代理目标 proxyFactory.setTarget(new TargetClass()) = new ProxyFactoryBean(); // 代理目标,支持从IOC中获取 proxyFactory.setTargetName("targetBean") ; proxyFactory.setBeanFactory(applicationContext); // 通知 proxyFactory.addAdvice
proxyFactory = new ProxyFactory(); // 复制当前 ProxyConfig 的一些属性(例如 proxyTargetClass、exposeProxy) proxyFactory.copyFrom(this); // 判断是否是代理类(也就是是否开启了CGLIB代理) 默认是false if (proxyFactory.isProxyTargetClass (advisors); // 代理工厂设置 TargetSource 对象 proxyFactory.setTargetSource(targetSource); // 对 ProxyFactory 代理工厂创建代理对象 return proxyFactory.getProxy(classLoader); } 源码分析 上述代码中的ProxyFactory proxyFactory = new ProxyFactory();新建了一个工厂类,并且往后看,明显的看出对于代理类的创建Spring是委托给了ProxyFactory处理的。
概述 在Spring中配置 通过配置文件实现增强 配置文件 ProxyFactory Bean配置文件当中常用的属性 测试类 其他代码 概述 在上篇博文的案例中 Spring-AOP 创建增强类- 前置增强 我们使用org.springframework.aop.framework.ProxyFactory通过编码的方式将GreetingBeforeAdvice的增强织入目标类NaiveWaiter [] interfaces)方法指定目标接口进行代理,则ProxyFactory使用JdkDynamaicAopProxy,如果针对类的代理,则使用Cglib2AopProxy. 此外,还可以通过ProxyFactory的setOptimize(true)方法让ProxyFactory启动优化代理方式,这样,针对接口的代理也会使用Cglib2AopProxy。 我们使用JDK代理来实现 Spring-AOP 增强(Advice)类型和创建增强类 中的业务测试类 //创建代理工厂对象 ProxyFactory factory=new ProxyFactory(
proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension(); private 首先会对url进行dynamic和monitorUrl校验和配置,然后会调用proxyFactory#getInvoker生成一个invoker对象。 proxyFactory是由dubbo的spi生成的代理对象ProxyFactory$Adaptive,我们来看看具体的代码: public class ProxyFactory$Adaptive implements var6 = (ProxyFactory)ExtensionLoader.getExtensionLoader(ProxyFactory.class).getExtension $Adaptive() { } } 所以proxyFactory#getInvoker最终会通过 ProxyFactory$Adaptive生成一个invoker对象。
proxyFactory = new ProxyFactory();//创建工厂 proxyFactory.setTargetObject(new ManWaiter());//设置目标对象 下面我把Spring中的ProxyFactory实现贴出来,大家可以研究一下Spring中的ProxyFactory的优势在哪里,另外,Spring中还有其他的基于动态代理实现的织入器,ProxyFactory >public class ProxyFactory extends ProxyCreatorSupport { public ProxyFactory() { } proxyFactory = new ProxyFactory(); proxyFactory.setTargetSource(targetSource); proxyFactory.setProxyTargetClass(true); return proxyFactory.getProxy(); }
ProxyFactory proxyFactory = new ProxyFactory(); //复制当前类的一些属性 proxyFactory.copyFrom(this); (proxyFactory); // 该属性用来控制代理工厂被配置以后,是否还允许修改通知,默认为false proxyFactory.setFrozen(this.freezeProxy ); if (advisorsPreFiltered()) { proxyFactory.setPreFiltered(true); } // 创建代理 > beanClass, ProxyFactory proxyFactory) { Class<? proxyFactory.setProxyTargetClass(true); } } proxyFactory.getProxy(getProxyClassLoader()); 通过这行代码我们可以看到有两个实现类分别是
Spring繁华的AOP王国---第二讲 Spring AOP的织入 如何与ProxyFactory打交道 1.基于接口的代理 2.基于类的代理 3.Introduction的织入 看清ProxyFactory 的本质 ProxyConfig Advised AdvisedSupport ProxyFactory,AopProxy,AdvisedSupport与ProxyFactory的关系 小结 容器中的织入器 weaver=new ProxyFactory(task); weaver.setInterfaces(ITask.class); NameMatchMethodPointcutAdvisor weaver=new ProxyFactory(task); NameMatchMethodPointcutAdvisor advisor=new NameMatchMethodPointcutAdvisor ; } } MockTask task=new MockTask(); ProxyFactory weaver=new ProxyFactory(task);
举一个使用的例子,如下: ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(new CalculatorImpl 举个简单例子: ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(new CalculatorImpl()); 然后使用这个切点: ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(new CalculatorImpl() proxyFactory = new ProxyFactory(); proxyFactory.setTarget(new CalculatorImpl()); proxyFactory.addInterface 如下案例: ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(new CalculatorImpl()); proxyFactory.addInterface
proxyFactory = new ProxyFactory(); proxyFactory.setTarget(target); proxyFactory.setProxyTargetClass proxyFactory = new ProxyFactory(); proxyFactory.setTarget(target); proxyFactory.setProxyTargetClass proxyFactory = new ProxyFactory(); proxyFactory.setTarget(target); proxyFactory.setProxyTargetClass (true); proxyFactory.addAdvice(0, methodInterceptor); proxyFactory.addAdvice(1, afterAdvice); proxyFactory.addAdvice proxyFactory = new ProxyFactory(); proxyFactory.setTarget(target); proxyFactory.setProxyTargetClass
准备代理工厂 ProxyFactory pf = new ProxyFactory(); // 3. pf = new ProxyFactory(); pf.setTarget(s); // 主动调用addInterface,proxyFactory才会采用jdk动态代理 pf = new ProxyFactory(); pf.setTarget(s); pf.addInterface(Boy.class); Object pf = new ProxyFactory(); pf.setTarget(people); Object proxy = pf.getProxy(); pf = new ProxyFactory(); pf.setTarget(teacher); Object proxy = pf.getProxy();
proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); if (! proxyFactory.isProxyTargetClass()) { if (shouldProxyTargetClass(beanClass, beanName)) { proxyFactory.setProxyTargetClass proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); proxyFactory.setFrozen return proxyFactory.getProxy(getProxyClassLoader()); } 我们能够看到其中有一行让我们激动的代码,就是 ProxyFactory proxyFactory = new ProxyFactory(),创建了一个ProxyFactory 对象。