- 浏览: 223725 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
kandari:
很全,收藏
oracle相关知识 -
若见三生石:
,辛苦楼主!感谢为大伙敏捷开发做出贡献!
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
若见三生石:
你好,要定义的类和类型怎么写呢?
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
greatwqs:
...
PLSQL操作文件 -
sun17921:
var areaCode ={11:"北京" ...
身份证验证JS
AOP生成代码有三种可能方式:
(1)静态编译时期,源代码生成。为每个符合条件的类方法产生对应的Proxy对象。AspectJ以前就是这种方式。
(2)静态编译时期,处理编译后的字节码。Java、Python之类的虚拟机语言都有一种中间代码(Java的中间代码叫做字节码),AOP处理程序可以分析字节码,并直接产生字节码形式的Proxy。这种方式也叫做静态字节码增强。AspectJ也支持这种方式。Java有一些开源项目,比如 ASM、Cglib等,可以分析并生成Java字节码。这些开源项目不仅可以静态分析增强字节码,还可以在程序运行期动态分析增强字节码。很多AOP项目,比如Spring AOP,都采用ASM/Cglib处理字节码。
(3)动态运行时期,即时处理装载到虚拟机内部的类结构字节码。这也叫做动态增强。比如,Spring AOP。如前所述,Spring AOP使用ASM/Cglib之类的处理字节码的开源项目。Java运行库本身也提供了类似于ASM/Cglib的简单的动态处理字节码的API,叫做 Dynamic Proxy。
以上就是AOP的实现原理:Proxy Pattern + Method Reflection + Aspect DSL + 自动代码生成。
spring中AOP实现:
<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>com.ascenttech.springaop.test.Bean</value> </property> <property name="target"> <ref local="beanTarget"/> </property> <property name="interceptorNames"> <list> <value>theAdvisor</value> </list> </property> </bean>
bean,它可以通过一个工厂来创建。bean是ProxyFactoryBean的一个实现,它是Spring framework的一部分。这个bean的行为通过以下的3个属性来定义。
— 属性proxyInterface定义了接口类。
— 属性target指向本地配置的一个bean,这个bean返回一个接口的实现。
— 属性interceptorNames是惟一允许定义一个值列表的属性,这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的。
动态代理,Dynamic Proxy
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[]。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。 args)
(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
spring实现AOP可以利用两种技术——JDK的动态代理和CGLIB。首先要讲一下动态代理的概念。所谓动态指的是代理类是由JDK帮我们生成的,我们不需要写代理类的代码。那何谓代理呢?先看一下下面这张类图:
Target是需要被代理的类。Proxy就是代理类。他们必须实现相同的接口。并且代理类中包含被代理的实例。工作时,客户端获得的是代理类的实例。调用接口中定义的方法时会去调用Proxy的具体方法。Proxy再通过自己内部的Target实例调用被代理类的方法。也就是说实际工作的还是Target类的实例。当然在Target实例方法调用的前后可以加一些用户定制的行为(例如可以输出一下日志)。这就是简单的AOP了。
对上面的代码进行重构:
用工厂类创建实例:
package cm.longtop.zhmh.dynamicproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; //工厂类负责创建实例 public class ProxyFactory { public static Subject createInstant(String className){ Object obj; InvocationHandler ih; Subject sub=null; try { obj= Class.forName(className).newInstance(); ih=new SubjectDynamicProxy(obj); sub=(Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class}, ih); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sub; } }
测试类改成:
public class Test { public static void main(String[] args) throws Throwable{ InvocationHandler ih =null; Subject sub=null; sub=ProxyFactory.createInstant("cm.longtop.zhmh.dynamicproxy.RealSuject1"); sub.doAction(); sub=ProxyFactory.createInstant("cm.longtop.zhmh.dynamicproxy.RealSuject2"); sub.doAction(); }
发表评论
-
Spring 框架的设计理念与设计模式分析
2011-07-20 16:23 856http://www.ibm.com/developerwor ... -
struts1.2和2.0
2011-07-14 13:33 861WebWork 2 : 与Struts的比较 Th ... -
Struts1和Struts2的区别
2009-12-30 16:13 778Action 类: ◆Struts1要求Action类继承 ... -
WebWork概述
2009-12-30 16:12 790WebWork是建立在称为XWork的Command模式框架之 ... -
IBATIS缓存
2009-12-23 17:56 813iBATIS可以在Mapped Statement ... -
IOC实现原理
2009-12-16 21:03 1582对Spring IOC的理解离不开 ... -
spring的AOP理论
2009-12-16 13:01 863AOP术语:http://kang.iteye.com/blo ... -
Hibernate悲观锁和乐观锁
2009-12-16 12:57 915锁 ( locking ) 业务逻辑的实现过程中,往 ... -
webService理论和XFire
2009-12-14 15:42 873http://in3040.blog.163.com/blog ... -
Hibernate理论
2009-12-13 15:14 835hibernate对JPA支持:http:// ... -
EJB理论3.0
2009-12-11 15:08 780在已经提交的EJB3.0规范 ... -
WebService实现包--AXIS2
2009-12-11 14:48 1544深度探索 Axis2:AXIOM: http://ww ... -
EJB理论
2009-12-11 14:36 8341、EJB与JAVA BEAN的区别 ... -
RMI理论
2009-12-11 11:06 793一、RMI系统运行机理 RMI应用程序通常包括两个 ... -
RMI应用的实现例子1和spring实现的RMI例子2
2009-12-11 10:11 3585一个正常工作的RMI系统由下面几个部分组成: ● 远 ... -
spring2.5中的@注释配置
2009-12-10 20:01 974下面这篇文章写得很更清晰 http://haowei0315 ... -
AOP总结(spring)
2009-12-10 14:32 957实现AOP流程: Service s = new Servi ... -
AOP的JDK and CGLib 动态代理 示例
2009-12-09 16:50 1010package com.proxy; public ... -
AOP例子(spring配置实现)
2009-12-07 13:13 1740此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没 ... -
AOP理论
2009-12-07 11:45 808原文地址:http://dev.csdn. ...
相关推荐
本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是一种编程范式,它允许开发者定义“切面”,即关注点的模块化,如日志、事务管理等。这些切面可以...
本篇文章将详细探讨Spring实现AOP的四种主要方法:基于代理的方式、基于AspectJ的注解方式、基于XML的AOP配置以及基于Java的AOP配置。 1. 基于代理的实现 Spring的AOP支持两种代理类型:JDK动态代理和CGLIB代理。...
在C#中,实现AOP的方法多种多样,以下将详细介绍几种常见的实现方式。 1. **静态织入**: 静态织入是在编译时完成的,它通过编译器或者编译插件(如PostSharp)在目标类的代码中插入拦截逻辑。这种方式的优点是...
在IT领域,Spring框架是Java开发中的重要组成部分,特别是其AOP(面向切面编程)模块,它允许开发者实现横切关注点,如日志、事务...理解并掌握这四种方式,将有助于我们更好地利用Spring AOP来优化和解耦我们的代码。
它提供了一种简单的方式来改变类的结构或行为,而无需重新编译源代码。例如,我们可以使用Javassist添加拦截器来记录方法调用的时间。 ```java ClassPool pool = ClassPool.getDefault(); CtClass ctClass = pool....
AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要概念,它提供了一种将关注点(如日志、事务管理等)与核心业务逻辑分离的方式,从而实现代码的模块化和可重用性。AOP通过定义切面...
在实际开发中,理解并掌握这四种AOP实现方式对于编写高效、灵活的代码至关重要。Spring的AOP特性使得我们能够更好地组织代码,将横切关注点与业务逻辑分离,从而提升代码的可重用性和可测试性。在学习和应用这些知识...
Spring AOP通过两种代理模式实现:JDK动态代理和CGLIB代理。JDK代理主要针对接口,当目标对象实现了接口时,Spring会创建该接口的代理对象。CGLIB代理则是在运行时动态生成目标类的子类,如果目标类没有接口,Spring...
Spring AOP提供了一种声明性的方式来实现这些关注点,而无需侵入核心业务逻辑。通过定义切面和通知,我们可以把通用功能注入到应用程序的不同部分。 接下来,Ehcache是一个流行的Java缓存解决方案,它提供了本地...
本文将详细介绍Spring实现AOP的四种方式,包括基于代理的经典方式、@AspectJ注解驱动、纯POJO切面以及注入式AspectJ切面。 首先,理解AOP的基本概念: 1. **通知(Advice)**:通知定义了切面在何时执行,Spring支持...
Spring AOP,全称Spring Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Spring AOP中,...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
Spring 实现 AOP 的四种方式 Spring 框架提供了四种方式来实现Aspect-Oriented Programming(AOP),分别是经典的基于代理的 AOP、@AspectJ 注解驱动的切面、纯 POJO 切面和注入式 AspectJ 切面。下面将详细介绍这...
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
Spring通过动态代理来实现AOP,它支持两种代理方式:JDK动态代理和CGLIB代理。 1. JDK动态代理:当目标类实现了至少一个接口时,Spring会使用java.lang.reflect.Proxy创建一个代理对象,该代理对象在调用接口方法时...
面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...
综上所述,spring AOP依赖的这三个jar包构成了Spring框架面向切面编程的基础,它们共同协作,提供了便捷、高效和强大的AOP能力,帮助开发者实现代码的解耦,提高可维护性和复用性。在实际开发中,理解并熟练运用这些...
总的来说,AOP是面向对象编程的一种补充,它提供了一种更灵活的方式来组织和管理代码,减少了重复工作,提高了代码质量。在Java开发中,了解和掌握AOP的概念和实现方式对于提升编程效率和软件设计能力大有裨益。
MySQL+MyBatis自动生成代码工具是一种高效的方式来加速开发过程,尤其在基于Spring和Maven的项目中。这个工具能够帮助开发者从数据库中的表格结构自动创建对应的Java实体类、Mapper接口、XML映射文件以及Service和...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。这些关注点通常与业务逻辑无关,但又在多个地方被用到,AOP就是为了...