- 浏览: 50520 次
- 性别:
- 来自: 南京
文章分类
最新评论
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
AopProxyHelloWorld
ProxyHelloWorld
MyInvocationHandler:
在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; } }
发表评论
-
spring疑难解惑-循环依赖的解决
2020-06-17 23:27 544AbstractAutowireCapableBeanFact ... -
spring容器
2019-07-14 08:47 306private final ServletContainer ... -
spring容器
2019-07-13 23:35 0spring容器与springmvc容器 73 ... -
spring源码学习系列2.6-spring ioc原理-codes
2019-03-05 22:56 489web.xml <listener> < ... -
spring源码学习系列3.4-spring mvc原理-codes
2019-01-21 22:46 298本篇章从核心类角度解读springmvc的原理 web.xm ... -
spring源码学习系列4.2-spring aop原理-codes
2018-12-04 22:29 564jdk: Proxy InvocationHandler ... -
spring源码学习系列4.1-spring实现对ibatis的事务管理
2018-09-17 15:44 580事务由spring管理,可以理解为由spring管理数据库连接 ... -
spring源码学习系列4-3种常用的自动代理创建器
2018-09-02 15:48 5733种自动代理器是 AnnotationAwareAspectJ ... -
spring源码学习系列1.2-spring事务代理深入分析2
2018-05-27 19:46 453提示: BeanPostProcessor AopUtils ... -
spring源码学习系列2.5-ApplicationContext初始化-设计模式
2018-05-08 15:17 522ApplicationContext容器的初始化可以通过模板方 ... -
spring源码学习系列3.3-DispatcherServlet初始化-设计模式
2018-05-07 11:12 624springmvc的核心是DispatcherServlet ... -
封装spring-security
2018-01-23 19:33 520github地址: https://github.com/ne ... -
eclipse导入spring源码
2018-05-12 07:20 983spring在git上的项目时gradle管理jar包的,所以 ... -
spring源码学习系列3.2.3-异常页面拦截机制
2017-07-29 19:07 771前序:本文的意义在于了解 tomcat处理异常 请求访问 ... -
spring源码学习系列3.2.2-How to bind String to Date
2017-07-17 12:40 600springmvc开发中,经常需将界面日期数据(String) ... -
spring源码学习系列3.2.1-command对象的绑定
2017-05-28 12:00 984在<spring源码学习系列3.2-handlerAda ... -
spring源码学习系列3.2-handlerAdapter执行
2017-05-28 12:01 411DispatcherServlet#doDispatch中调用 ... -
spring源码学习系列3.1-handlerMapping初始化
2017-05-28 11:56 704SimpleUrlHandlerMapping的继承体系 or ... -
spring源码学习系列2.4-finishRefresh会做什么
2017-05-06 16:36 580spring容器初始化完成后,调用finishRresh 该 ... -
spring源码学习系列3-springmvc原理
2017-05-28 11:56 460问题: springmvc是如何控 ...
相关推荐
在Spring框架中,AOP(面向切面编程)是一个核心特性,它允许我们在不修改代码的情况下,对程序的行为进行统一的管理和控制。`ProxyFactoryBean`是Spring AOP实现中的一个重要类,它用于创建代理对象,使我们能够...
3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................
《深入剖析Spring Framework 5.1.x:源码解析与实战指南》 Spring Framework作为Java领域最广泛应用的轻量级框架之一,其5.1.x版本的发布带来了许多改进和新特性,为开发者提供了更高效、更灵活的开发体验。本篇...
在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以用来创建JDK代理对象。 下面是一段简单的示例代码,展示了如何使用Spring的JDK动态代理...
Spring 框架中 @Transactional 注解的工作原理分析 在 Spring 框架中,@Transactional 注解是一个非常重要的概念,经常用于数据库操作。那么,@Transactional 注解是如何工作的呢?让我们深入源码分析。 首先,从 ...
7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理(autoproxy)”功能 7.9.1. 自动代理bean定义 7.9.1.1. BeanNameAutoProxyCreator 7.9.1.2. DefaultAdvisorAutoProxyCreator ...
- **Proxy(代理)**:在目标对象和执行动作之间创建的一个对象,用于实现AOP功能。 2. AOP的不同类型的通知 - **BeforeAdvice(前置通知)**:在目标方法执行之前执行的通知。 - **AfterAdvice(后置通知)**:...
- **使用auto-proxy功能**:Spring自动代理机制。 - **事务管理** - **事务管理介绍**:Spring提供的事务管理模块。 - **DAO支持** - **DAO支持概述**:Spring提供了对数据访问层的支持。 - **JDBC** - **...
《深入解析Spring AOP:源码解读与应用实践》 Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP...
Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...
7. 代理(Proxy):代理是包含目标对象和增强逻辑的对象,它在目标对象和增强之间起到桥梁的作用。 Spring AOP 的实现基于动态代理技术,根据目标对象是否实现了接口,可以选择使用 JDK 动态代理(针对接口)或 ...
在Spring AOP中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以用来创建代理对象。这两个类都提供了设置目标对象、配置切点(Pointcut)和通知...
- `org.springframework.aop.framework.ProxyFactory`:这是一个非bean工厂类,提供了与`ProxyFactoryBean`相似的功能,但不依赖于IoC容器。 - `org.springframework.aop.framework.Advised`:这个接口定义了对代理...
通过分析这些源代码,我们可以深入理解Spring的工作原理,学习其设计模式,比如单例模式、工厂模式、代理模式等,同时也能掌握Spring如何实现DI和AOP。此外,这也有助于我们定制和扩展Spring框架,提升我们的开发...
17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...
最后,通过Spring的ProxyFactory创建代理对象,配置Advice,运行客户端代码,实现了在调用sayHello()前后插入自定义的行为。 需要注意的是,Spring AOP的实现并不局限于Eclipse环境,它可以在任何Java环境中使用。...
Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 简介 2.1.概述 2.2.背景 2.3.模块 2.4.许可证信息 2.5.支持 第三章 背景 3.1.控制反转 第...
3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................
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...