`

AOP生成代码三种方式

阅读更多

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 AOP面向切面三种实现

    本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是一种编程范式,它允许开发者定义“切面”,即关注点的模块化,如日志、事务管理等。这些切面可以...

    Spring实现AOP的4种方式

    本篇文章将详细探讨Spring实现AOP的四种主要方法:基于代理的方式、基于AspectJ的注解方式、基于XML的AOP配置以及基于Java的AOP配置。 1. 基于代理的实现 Spring的AOP支持两种代理类型:JDK动态代理和CGLIB代理。...

    利用C#实现AOP常见的几种方法详解

    在C#中,实现AOP的方法多种多样,以下将详细介绍几种常见的实现方式。 1. **静态织入**: 静态织入是在编译时完成的,它通过编译器或者编译插件(如PostSharp)在目标类的代码中插入拦截逻辑。这种方式的优点是...

    Spring AOP 常用的四种实现方式

    在IT领域,Spring框架是Java开发中的重要组成部分,特别是其AOP(面向切面编程)模块,它允许开发者实现横切关注点,如日志、事务...理解并掌握这四种方式,将有助于我们更好地利用Spring AOP来优化和解耦我们的代码。

    aop的四种实现方式

    它提供了一种简单的方式来改变类的结构或行为,而无需重新编译源代码。例如,我们可以使用Javassist添加拦截器来记录方法调用的时间。 ```java ClassPool pool = ClassPool.getDefault(); CtClass ctClass = pool....

    AOP四种配置方式demo

    AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要概念,它提供了一种将关注点(如日志、事务管理等)与核心业务逻辑分离的方式,从而实现代码的模块化和可重用性。AOP通过定义切面...

    Spring实现AOP的4种方式 - Java -

    在实际开发中,理解并掌握这四种AOP实现方式对于编写高效、灵活的代码至关重要。Spring的AOP特性使得我们能够更好地组织代码,将横切关注点与业务逻辑分离,从而提升代码的可重用性和可测试性。在学习和应用这些知识...

    spring4 AOP 源代码

    Spring AOP通过两种代理模式实现:JDK动态代理和CGLIB代理。JDK代理主要针对接口,当目标对象实现了接口时,Spring会创建该接口的代理对象。CGLIB代理则是在运行时动态生成目标类的子类,如果目标类没有接口,Spring...

    AOP Cache源代码

    Spring AOP提供了一种声明性的方式来实现这些关注点,而无需侵入核心业务逻辑。通过定义切面和通知,我们可以把通用功能注入到应用程序的不同部分。 接下来,Ehcache是一个流行的Java缓存解决方案,它提供了本地...

    Spring实现AOP的四种方式

    本文将详细介绍Spring实现AOP的四种方式,包括基于代理的经典方式、@AspectJ注解驱动、纯POJO切面以及注入式AspectJ切面。 首先,理解AOP的基本概念: 1. **通知(Advice)**:通知定义了切面在何时执行,Spring支持...

    springAop默认代理方式.zip

    Spring AOP,全称Spring Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Spring AOP中,...

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

    Spring实现AOP的四种方式.pdf

    Spring 实现 AOP 的四种方式 Spring 框架提供了四种方式来实现Aspect-Oriented Programming(AOP),分别是经典的基于代理的 AOP、@AspectJ 注解驱动的切面、纯 POJO 切面和注入式 AspectJ 切面。下面将详细介绍这...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    spring源代码分析:aop的实现

    Spring通过动态代理来实现AOP,它支持两种代理方式:JDK动态代理和CGLIB代理。 1. JDK动态代理:当目标类实现了至少一个接口时,Spring会使用java.lang.reflect.Proxy创建一个代理对象,该代理对象在调用接口方法时...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...

    spring AOP依赖三个jar包

    综上所述,spring AOP依赖的这三个jar包构成了Spring框架面向切面编程的基础,它们共同协作,提供了便捷、高效和强大的AOP能力,帮助开发者实现代码的解耦,提高可维护性和复用性。在实际开发中,理解并熟练运用这些...

    AOP编程入门 Word版

    总的来说,AOP是面向对象编程的一种补充,它提供了一种更灵活的方式来组织和管理代码,减少了重复工作,提高了代码质量。在Java开发中,了解和掌握AOP的概念和实现方式对于提升编程效率和软件设计能力大有裨益。

    mysql+mybatis自动生成代码工具

    MySQL+MyBatis自动生成代码工具是一种高效的方式来加速开发过程,尤其在基于Spring和Maven的项目中。这个工具能够帮助开发者从数据库中的表格结构自动创建对应的Java实体类、Mapper接口、XML映射文件以及Service和...

    spring-aop和注解的实例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来实现横切关注点,如日志、事务管理、性能监控等。这些关注点通常与业务逻辑无关,但又在多个地方被用到,AOP就是为了...

Global site tag (gtag.js) - Google Analytics