`

使用动态代理实现简单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
我奔跑迅速

分享到:
评论

相关推荐

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

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

    这个例子的功能是使用动态代理的思想实现一个spring简易的bean工厂和aop。

    java分页 动态代理 aop实现

    动态代理 实现简单分页 spring aop 实现简单分页

    用Java动态代理实现AOP

    目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等。...这里只是意图通过一个简单的例子向初学者展示一下如何来进行AOP。

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

    对应的博客链接:http://blog.csdn.net/JQ_AK47/article/details/60469034#t12

    手写简单实现ioc、aop事务demo

    手写简单实现ioc、aop事务demo,实现事务回滚,使用到了,工厂模式,动态代理

    Java动态代理在AOP中的应用

    本文首先介绍了AOP 的基本思想,然后针对它在JAVA 语言 中的实现,具体介绍了JAVA 的动态代理来怎样实现一个简单的AOP 容器

    简易的AOP框架

    一个简单实现的AOP框架。里面涵盖: 有配置文件,自定义注解,Bean容器,示例用的servicebean,产生动态代理对象的工具类等。

    Spring AOP 动态代理(二)

    代理模式其实很简单 主要包括 接口+真实的实现类+代理类 在真实类的实例化的时候 使用代理类,所以需要 Spring AOP 做的是生成一个代理类,然后替换真实的类 去对外提供服务 那怎么去替换呢? 就是Spring IOC 容器中...

    AOP代理 用Spring框架实现

    这是一个用Spring框架实现的AOP代理例子,简单易学

    基于java的企业级应用开发:JDK动态代理.ppt

    CGLIB代理 通过前面的学习可知,JDK的动态代理用起来非常简单,但它是有局限性的,使用动态代理的对象必须实现一个或多个接口。 那么,如何代理没有实现接口的类? CGLIB代理 CGLIB(Code Generation Library)是一...

    Spring AOP源码分析.mmap

    哪怕没有看过源码的同学也应该知道,AOP是通过动态代理实现的,动态代理又分为两个部分:JDK动态代理和CGLIB动态代理 确实,Spring也就是通过这两种方式来实现AOP相关功能,下面就通过源码来简单求证下

    java 实现AOP

     为了简单起见,例子没有没有使用任何第三方的AOP Framework, 而是利用Java语言本身自带的动态代理功能来实现AOP.  让我们先回到AOP本身,AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。它的主要...

    spring aop 实现源代码--xml and annotation(带lib包)

    在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...

    【源码:AopFk】如何使用 Java 编写一个简单的 AOP 框架

    标题: 如何使用 Java 编写一个简单的 AOP 框架 作者: 超逮虾户 摘要: AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它允许程序员以模块化的方式添加功能到应用程序。AOP 框架通过在程序...

    浅谈C# AOP的简单实现

    老规矩,还是先看官方解释:AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方

    SimpleAop.Net:SimpleAop是用于AOP或动态代理编程的库

    SimpleAop是用于Aop或动态代理编程的库。 我更简单地从。 这里包括以下库。 SimpleAop 它需要Aop或动态代理编程。 SimpleAop.Extensions.DependencyInjection 这里包括用于.NET Core或ASP.NET Core的...

    Java动态代理简单应用

    概念  代理模式是基本的设计模式之一,它是开发者为了提供额外的或...  Java动态代理实现机制采用了反射的思想,有关于反射的基础知识,可以参见博客Java发射机制浅析。  原理  Spring核心AOP实现技术之一是采用

Global site tag (gtag.js) - Google Analytics