`

使用动态代理实现简单AOP

阅读更多

Spring默认使用JDK动态代理来实现AOP,如果业务对象没有实现接口,默认使用CGLIB代理,面向接口编程是一个良好得习惯,尽量不要面向具体类

首先,有个Dog接口

package AOP.SimapleAOP;

public interface Dog ...{
   public void info();
   public void run();
}

 然后给出这个接口的实现类:

package AOP.SimapleAOP;


public class DogImpl implements Dog ...{

    public void info() ...{
        System.out.println("我是一只猎狗");
    }

    public void run() ...{
        System.out.println("我奔跑迅速");
    }

    

}

 

DogFactory:

package AOP.SimapleAOP;

public class DogFactory ...{
   private static DogFactory df;
   private Dog gundog;
   private DogFactory()...{
       
   }
   public static DogFactory instantce()...{
       if(df==null)...{
           df=new DogFactory();
       }
       return df;
   }
   public Dog getDog(String dogName)...{
       if(dogName.equals("gundog"))...{
           if(gundog==null)...{
               return new DogImpl();
           }
           return gundog;
       }
       return null;
   }
}

 

 

 下面是一个通用类:没有和任何特定的类耦合

 

package AOP.SimapleAOP;

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

public class ProxyHandler implements InvocationHandler ...{
    private Object targetObject;
    public void setTargetObject(Object targetObject) ...{
        this.targetObject = targetObject;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable ...{
        Object result=null;
        if(method.getName().equals("info"))...{
            System.out.println("begin");
            result=method.invoke(targetObject, args);
            System.out.println("end");
        }
        else...{
            result=method.invoke(targetObject, args);
        }
        return null;
    }
    
} 

 

上述代码通过mehtod对象的invoke方法,可以完成目标对象得方法可调用,目标是Object类型,可以使任何业务实现类,在目标对象的info方法中,进行了功能增强(多打印了begin和end)

代理工厂:

package AOP.SimapleAOP;

import java.lang.reflect.Proxy;

public class MyProxyFacytory ...{
   public static Object getProxy(Object object)...{
       ProxyHandler handler=new ProxyHandler();
       handler.setTargetObject(object);
       //第一参数用来创建动态代理的ClassLoader对象,只能该对象能访问dog接口即可
       //第二个参数是接口数组
       //第三个参数是代理包含的处理实例
       return Proxy.newProxyInstance(DogImpl.class.getClassLoader(), object.getClass().getInterfaces(), handler);
   }
} 

 

Dynamic Proxy要求被代理的必须是接口的实现类,都则无法为其构造相应的动态类,所以Spring对接口全部采用Dynamic Proxy 实现AOP,对没有实现接口的类采用CGLIB

测试代码:

package AOP.SimapleAOP;

public class Test ...{

    public static void main(String[] args) ...{
        Dog dog=null;
        Dog targetObject=DogFactory.instantce().getDog("gundog");
        Object proxy=MyProxyFacytory.getProxy(targetObject);
        if(proxy instanceof Dog)...{
            dog=(Dog)proxy;
        }
        dog.info();
        dog.run();
    }

}

 

结果:

begin
我是一只猎狗
end
我奔跑迅速

分享到:
评论

相关推荐

    用Java动态代理实现AOP

    在本文中,我们将通过一个简单的例子来展示如何使用Java动态代理实现AOP。首先,我们定义了一个business接口和一个实现类BusinessObject,BusinessObject中包含了商业逻辑代码和日志记录代码。 ```java public ...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    使用代理实现简易的spring aop功能

    在这个例子中,我们将探讨如何使用动态代理来实现一个简单的Spring AOP功能。 动态代理是Java提供的一种机制,它允许我们在运行时创建对象的代理,该对象可以代表原对象执行额外的操作。在Spring AOP中,有两种主要...

    动态代理实现AOP思想

    以下是一个简单的例子,展示了如何使用Java动态代理实现AOP: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface MyInterface {...

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

    以下是一个简单的动态代理实现示例: ```java public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } @...

    动态代理实现aop

    ### 动态代理实现AOP #### 概述 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在通过将横切关注点与业务逻辑分离来提高系统的模块化程度。本篇文章主要介绍了如何利用Java动态代理技术...

    通过动态代理模拟Spring AOP

    - 虽然Java动态代理能实现简单的AOP功能,但它有一些限制。例如,它只能代理实现了接口的类,而不能代理没有接口或实现了多个接口的类。Spring AOP通过CGLIB库解决了这个问题,可以代理任何类。 - Spring AOP提供...

    用java自己实现的动态代理 AOP

    下面是一个简单的Java动态代理实现AOP的例子,模拟日志记录功能: ```java public interface MyInterface { void doSomething(); } public class MyTarget implements MyInterface { @Override public void ...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    在Java中,我们可以使用JDK的动态代理或者Spring AOP来实现代理模式。 JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类是生成代理对象的工厂,而...

    动态代理(AOP)简单例子

    在这个"动态代理(AOP)简单例子"中,可能会展示如何使用JDK或CGLIB创建代理对象,以及如何使用匿名类实现InvocationHandler接口。同时,通过对比直接调用和动态调用,可以更直观地理解动态代理带来的优势。这个例子...

    java-用Java动态代理实现AOP.pdf

    从文件内容可以看出,文档主要讨论了如何使用Java动态代理来实现AOP的基本原理。文档中提供了一个简单的例子,其中定义了一个业务接口BusinessInterface和一个实现了该接口的BusinessObject类。BusinessObject类中的...

    Java编程中使用动态代理实现AOP功能(附项目设计实例)

    综上所述,通过动态代理实现AOP可以极大地简化项目中的代码维护,提高开发效率,同时也为开发者提供了一种灵活处理横切关注点的方式。对于需要进行业务逻辑增强的项目,这是一种值得推荐的设计模式。

    从JDK动态代理到spring AOP

    在IT领域,动态代理和AOP(面向切面编程)是两种重要的编程概念,它们能够帮助我们实现代码的解耦和模块化。本篇将详细探讨JDK动态代理和Spring AOP,以及它们在实际应用中的作用。 首先,JDK动态代理是Java提供的...

    基于Java动态代理的AOP实现.zip

    本项目旨在通过Java的动态代理技术实现面向切面编程(AOP),涵盖了静态代理、JDK动态代理、CGLIB动态代理、AspectJ以及基于instrumentation的动态代理等多种实现方式。通过这些实现方式,可以在不修改原有代码的...

    使用java动态代理技术实现简单的AOP切面编程实例

    Java 动态代理技术是Java平台提供的一种强大的编程机制,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以对方法调用进行拦截和处理,这正是AOP(面向切面编程)的核心思想。在Java中,动态代理主要...

Global site tag (gtag.js) - Google Analytics