`

spring源码学习系列1.1-ProxyFactory AopProxy与Proxy之间的关系

 
阅读更多
1.ProxyFactory持有生成代理的相关资源,如advice targetSource等属性(资源)。ProxyFactory是ProxyConfig及AdvisorSupport的子类,这些属性在AdvisorSupport中。

在ProxyFactory中委托AopProxyFactory生成AopProxy,并将自身传给AopProxy

可以将ProxyFactory当做现实中的某个工厂。工厂中有各种各样的原材料,在这里,这些原材料就是目标类,目标类所实现的接口,拦截器等等。目标类或者接口可以想象成要加工的东西,而拦截器等就是一些辅助材料,用来加工最终成型的产品。
对于调用这来说,他只要提供材料就行或最终得到产品就行,不需要关心这些材料在一起怎么生成产品的


例如:ProxyFactoryHelloWorld.java

2.AopProxy通过AopProxyFacotory生成,AopProxy持有以上ProxyFactory的对象,也即拥有了生成代理的相关资源。引用已有的某个对象的方法,可以继承某个对象或者持有某个对象,这个用了第二种方式即引用。

DefaultAopProxyFactory可以看做一个更大的工厂,包括了ProxyFactory这个小工厂或小作坊中的一些原材料(AdvisorSupport)。DefaultAopProxyFactory并不是ProxyFactory的子类,而是通过引用拥有了这个小工厂或者通过引用(AdvisorSupport)从而拥有了ProxyFactory相关的原材料

DefaultAopProxyFactory中仅仅通过new JdkDynamicAopProxy(config);或者CglibProxyFactory.createCglibProxy(config);来创建AopProxy对象。依据是ProxyFactory中的某些属性或者原材料

例如:AopProxyHelloWorld.java

3.AopProxy中继续通过Proxy生成最终代理,最终代理中持有AopProxy对象。

AopProxy:Delegate interface for a configured AOP proxy, allowing for the creation of actual proxy objects

AopProxy才可以最终生成实际的代理对象,当然DefaultAopProxyFactory这个工厂制造AopProxy这个产品时,也将ProxyFactory这个小作坊(AdvisorSupport)给了AopProxy或者AopProxy可以使用ProxyFactory的原材料。

以JdkDynamicAopProxy为例,其实现了InvocationHandler接口

例如:ProxyHelloWorld.java


综上:
原材料其实保存在ProxyFactory的父类AdvisedSupport中。ProxyFactory,AopProxyFactory,AopProxy通过不同方式共享这个AdvisedSupport中的原材料。AopProxy只是一个半成品,实际的代理对象中包括了这个半成品AopProxy。调用代理对象时,也是通过半成品aopProxy来执行代理操作

原材料的输入是在后置处理器InfrastructureAdvisorAutoProxyCreator中产生的




ProxyFactoryHelloWorld
package com.bill.tx;

import java.lang.reflect.Method;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;

public class ProxyFactoryHelloWorld {
	public static void main(String[] args) {
		ProxyFactory pf = new ProxyFactory();
		
		pf.setTarget(new HelloWorldImpl());// 基本材料
		pf.setInterfaces(HelloWorldImpl.class.getInterfaces());
		
		pf.addAdvice(new MethodBeforeAdvice() {
			
			@Override
			public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
				System.out.println("before1");
			}
		});
		
		pf.addAdvice(new MethodBeforeAdvice() {
			
			@Override
			public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
				System.out.println("before2");
			}
		});
		
		pf.addAdvice(new AfterReturningAdvice() {
			
			@Override
			public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
				System.out.println("afterReturning");
			}
		});
		
		pf.addAdvice(new MethodInterceptor() {

			@Override
			public Object invoke(MethodInvocation invocation) throws Throwable {
				System.out.println("MethodInterceptor-start");
				Object retValue = invocation.proceed();
				System.out.println("MethodInterceptor-end");
				return retValue;
			}
			
			
		});
		
		HelloWorld hello = (HelloWorld) pf.getProxy(pf.getClass().getClassLoader());
		String retValue = hello.sayHello("jpj");
		
		System.out.println("==================输出返回值");
		System.out.println(retValue);
	}
}



AopProxyHelloWorld
package org.springframework.aop.framework;

import java.lang.reflect.Method;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

import com.bill.tx.HelloWorld;
import com.bill.tx.HelloWorldImpl;

public class AopProxyHelloWorld {
	public static void main(String[] args) {
		AdvisedSupport config = new AdvisedSupport(); // 原材料
		
		config.setTarget(new HelloWorldImpl());
		config.setInterfaces(HelloWorldImpl.class.getInterfaces());
		
		config.addAdvice(new MethodBeforeAdvice() {
			
			@Override
			public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
				System.out.println("before1");
			}
		});
		
		config.addAdvice(new MethodBeforeAdvice() {
			
			@Override
			public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
				System.out.println("before2");
			}
		});
		
		config.addAdvice(new AfterReturningAdvice() {
			
			@Override
			public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
				System.out.println("afterReturning");
			}
		});
		
		config.addAdvice(new MethodInterceptor() {

			@Override
			public Object invoke(MethodInvocation invocation) throws Throwable {
				System.out.println("MethodInterceptor-start");
				Object retValue = invocation.proceed();
				System.out.println("MethodInterceptor-end");
				return retValue;
			}
			
			
		});
		
		AopProxy aopProxy = new JdkDynamicAopProxy(config);
		
		HelloWorld hello = (HelloWorld) aopProxy.getProxy(aopProxy.getClass().getClassLoader());
		String retValue = hello.sayHello("jpj");
		
		System.out.println("==================输出返回值");
		System.out.println(retValue);
	}
}



ProxyHelloWorld
package org.springframework.aop.framework;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

import com.bill.tx.HelloWorld;
import com.bill.tx.HelloWorldImpl;

public class ProxyHelloWorld {
	public static void main(String[] args) {
		AdvisedSupport config = new AdvisedSupport(); // 原材料
		
		config.setTarget(new HelloWorldImpl());
		config.setInterfaces(HelloWorldImpl.class.getInterfaces());
		
		config.addAdvice(new MethodBeforeAdvice() {
			
			@Override
			public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
				System.out.println("before1");
			}
		});
		
		config.addAdvice(new MethodBeforeAdvice() {
			
			@Override
			public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
				System.out.println("before2");
			}
		});
		
		config.addAdvice(new AfterReturningAdvice() {
			
			@Override
			public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
				System.out.println("afterReturning");
			}
		});
		
		config.addAdvice(new MethodInterceptor() {

			@Override
			public Object invoke(MethodInvocation invocation) throws Throwable {
				System.out.println("MethodInterceptor-start");
				Object retValue = invocation.proceed();
				System.out.println("MethodInterceptor-end");
				return retValue;
			}
			
			
		});
		
		JdkDynamicAopProxy aopProxy = new JdkDynamicAopProxy(config);
		
		Class[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(config);
		//findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
		HelloWorld hello = (HelloWorld) Proxy.newProxyInstance(aopProxy.getClass().getClassLoader(), proxiedInterfaces, aopProxy);
		String retValue = hello.sayHello("jpj");
		
		System.out.println("==================输出返回值");
		System.out.println(retValue);
	}
}


MyInvocationHandler:
package com.bill.tx;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyInvocationHandler implements InvocationHandler {
	Object target;
	public MyInvocationHandler(Object target) {
		this.target = target;
	}
	
	public static void main(String[] args) {
		InvocationHandler myHandler = new MyInvocationHandler(new HelloWorldImpl());
		
		HelloWorld hello = (HelloWorld) Proxy.newProxyInstance(myHandler.getClass().getClassLoader(), HelloWorldImpl.class.getInterfaces(), myHandler);
		hello.sayHello("jpj");
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("MyInvocationHandler-start");
		Object retValue = method.invoke(target, args);
		System.out.println("MyInvocationHandler-end");
		return retValue;
	}
	

}







  • 大小: 40.8 KB
分享到:
评论

相关推荐

    spring-aop-ProxyFactoryBean 源码分析

    在Spring框架中,AOP(面向切面编程)是一个核心特性,它允许我们在不修改代码的情况下,对程序的行为进行统一的管理和控制。`ProxyFactoryBean`是Spring AOP实现中的一个重要类,它用于创建代理对象,使我们能够...

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    spring-framework-5.1.x.zip

    《深入剖析Spring Framework 5.1.x:源码解析与实战指南》 Spring Framework作为Java领域最广泛应用的轻量级框架之一,其5.1.x版本的发布带来了许多改进和新特性,为开发者提供了更高效、更灵活的开发体验。本篇...

    Spring_0300_JDKProxy

    在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以用来创建JDK代理对象。 下面是一段简单的示例代码,展示了如何使用Spring的JDK动态代理...

    Spring源码学习十二:@Transactional是如何工作的1

    Spring 框架中 @Transactional 注解的工作原理分析 在 Spring 框架中,@Transactional 注解是一个非常重要的概念,经常用于数据库操作。那么,@Transactional 注解是如何工作的呢?让我们深入源码分析。 首先,从 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理(autoproxy)”功能 7.9.1. 自动代理bean定义 7.9.1.1. BeanNameAutoProxyCreator 7.9.1.2. DefaultAdvisorAutoProxyCreator ...

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    - **Proxy(代理)**:在目标对象和执行动作之间创建的一个对象,用于实现AOP功能。 2. AOP的不同类型的通知 - **BeforeAdvice(前置通知)**:在目标方法执行之前执行的通知。 - **AfterAdvice(后置通知)**:...

    Spring5.1中文参考指南.pdf

    - **使用auto-proxy功能**:Spring自动代理机制。 - **事务管理** - **事务管理介绍**:Spring提供的事务管理模块。 - **DAO支持** - **DAO支持概述**:Spring提供了对数据访问层的支持。 - **JDBC** - **...

    spring-aop.rar_aop1270_spring_spring aop

    《深入解析Spring AOP:源码解读与应用实践》 Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

    spring3.x的读书笔记-4

    7. 代理(Proxy):代理是包含目标对象和增强逻辑的对象,它在目标对象和增强之间起到桥梁的作用。 Spring AOP 的实现基于动态代理技术,根据目标对象是否实现了接口,可以选择使用 JDK 动态代理(针对接口)或 ...

    day39-Spring 03-JDK的动态代理

    在Spring AOP中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以用来创建代理对象。这两个类都提供了设置目标对象、配置切点(Pointcut)和通知...

    SPRING对动态代理的封装

    - `org.springframework.aop.framework.ProxyFactory`:这是一个非bean工厂类,提供了与`ProxyFactoryBean`相似的功能,但不依赖于IoC容器。 - `org.springframework.aop.framework.Advised`:这个接口定义了对代理...

    Spring源代码

    通过分析这些源代码,我们可以深入理解Spring的工作原理,学习其设计模式,比如单例模式、工厂模式、代理模式等,同时也能掌握Spring如何实现DI和AOP。此外,这也有助于我们定制和扩展Spring框架,提升我们的开发...

    Spring 2.0 开发参考手册

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

    SpringAOP

    最后,通过Spring的ProxyFactory创建代理对象,配置Advice,运行客户端代码,实现了在调用sayHello()前后插入自定义的行为。 需要注意的是,Spring AOP的实现并不局限于Eclipse环境,它可以在任何Java环境中使用。...

    spring.net中文手册在线版

    Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 简介 2.1.概述 2.2.背景 2.3.模块 2.4.许可证信息 2.5.支持 第三章 背景 3.1.控制反转 第...

    spring-framework-reference4.1.4

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    Spring API

    1.1. 概览 1.1.1. 使用场景 2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5...

Global site tag (gtag.js) - Google Analytics