`
hwpok
  • 浏览: 242148 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从代理机制 到 AOP

阅读更多
AOP(面向方面编程)是一种新的编程技术,它能够将那些本不应该纠缠在一起的任务分离开,从而为程序提供更好的封装性和互操作性.
AOP是通过代理机制实现的.
代理是指为其他对象提供一种代理以控制对这个对象的访问.
代理分为三种:
    1.静态代理,代理对象必须实现目标对象的接口,且一个接口只服务于一种类型的目标对象。
    2.JDK动态代理,代理对象必须实现java.lang.reflect.InvacationHandler接口,只能为接口创建代理实例。
    3.CGLib动态代理,使用非常底层的字节码技术,可以为任何对象创建代理.

以下是目标对象接口和目标对象.
目标对象接口如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package org.test.spring.aop;

public interface IHello
{
    
public void hello(String name);
}
目标对象如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package org.test.spring.aop;

public class HelloSpeaker implements IHello
{
    
public void hello(String name)
    {
        System.out.print(
"Hi," + name);
    }
}


一.静态代理
静态代理比较容易理解,静态代理其实很容易理解,静态代理其实就是个装饰器而已.
让代理对象也实现目标对像的接口,这样做的目的是让使用者在使用代理对象时感觉不到代理对象的存在.
代理对象如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package org.test.spring.aop;

public class HelloSpeakerProxy implements IHello
{
    
private IHello helloSpeaker;
    
    
public HelloSpeakerProxy(IHello helloSpeaker)
    {
        
this.helloSpeaker = helloSpeaker;
    }
    
    
public void hello(String name)
    {
        
this.helloSpeaker.hello(name);
        System.out.println(
", welcome to our pub.");
    }
    
    
public static void main(String[] args)
    {
        IHello helloSpeaker 
= new HelloSpeaker();
        IHello proxy 
= new HelloSpeakerProxy(helloSpeaker);
        proxy.hello(
"Huy Vanpon");
    }
}


二.JDK动态代理

所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package org.test.spring.aop;

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

public class HelloSpeakerProx implements InvocationHandler
{
    
    
private Object target;
    
    
public Object invoke(Object proxy, Method method, Object[] parameters)
            
throws Throwable
    {
        Object object 
= null;
        
try
        {
            object 
= method.invoke(target, parameters);
            System.out.println(
", welcome to our pub.");
        }
        
catch (Exception e)
        {
            e.printStackTrace();
        }
        
return object;
    }
    
    
/**
     * <p>
     * 这个方法用于得到代理对象
     * </p>
     * 
     * 
@param target
     *            目标对象
     * 
@return result(Object)代理对象
     
*/
    
public Object getProxy(Object target)
    {
        
this.target = target;
        
/**
         * newProxyInstance(ClassLoader loader, Class<?>[] interfaces,
         * InvocationHandler invocationHandler) loader: 定义代理类的加加载器(目标类的加载器)
         * interfaces: 代理类要实现的接口列表 invocationHandler: 指派方法调用的调用处理程序
         
*/
        
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), 
this);
    }
    
    
public static void main(String[] args)
    {
        IHello proxy 
= (IHello) new HelloSpeakerProx()
                .getProxy(
new HelloSpeaker());
        proxy.hello(
"Huy Vanpon");
    }
}


三.CGLib动态代理
使用jdk创建代理有一个限制,即它只能为接口创建代理实例.CGLib使用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的拦截技术,并顺势织入横切逻辑.
运行这个例子,一定要记得导入CGLib相应的包哦..
package org.test.spring.aop;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class HelloSpeakerPro implements MethodInterceptor
{
    
private Enhancer enhancer = new Enhancer();
    
    
public Object getProxy(Class clazz)
    
{
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(
this);
        
return enhancer.create();
    }

    
    
public Object intercept(Object object, Method method, Object[] args,
            MethodProxy proxy) 
throws Throwable
    
{
        Object result 
= null;
        result 
= proxy.invokeSuper(object, args);
        System.out.println(
", welcome to our pub.");
        
return result;
    }

    
    
public static void main(String[] args)
    
{
        HelloSpeakerPro helloSpeakerPro 
= new HelloSpeakerPro();
        HelloSpeaker helloSpeaker 
= (HelloSpeaker) helloSpeakerPro
                .getProxy(HelloSpeaker.
class);
        helloSpeaker.hello(
"Huy Vanpon");
    }

    
}


分享到:
评论

相关推荐

    代理机制及AOP原理实现

    spring中动态代理机制的实现原理及AOP实现原理,JDK的反射,cglib类。

    动态代理实现AOP机制

    动态代理实现AOP机制,动态代理实现AOP机制,动态代理实现AOP机制,动态代理实现AOP机制

    AOP动态代理(反射机制)

    介绍AOP动态代理很不错的一本技术书籍,里面又很多例子通俗易懂。

    AOP的实现机制

    Java在JDK1.3后引入的动态代理机制,使我们可以在运行期动态的创建代理类。使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类...

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

    AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理

    Spring AOP实现机制

    Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器

    动态代理和AOP详解

    本资源利用文档加源码的方式较详细的介绍了JDK 动态代理和Spring的AOP机制.相信对您理解相关方面的知识有很大作用.

    java反射与代理实现AOP

    利用java中的反射机制以及代理机制,实现了AOP。有详细的代码和实例

    spring aop代理列子

    package com.gc.aop下为:aop方式ProxyFactoryBean代理...package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) package com.gc.normal下为:通用日志处理方式

    spring AOP代理机制.docx

    sping AOP面向切面的编程,程序运行过程中动态加入所需代码等,对公共的问题进行集中处理,具体的实现有动态代理与静态代理,本文通过对AOP的代理机制,前置、后置、环绕、异常的通知进行了综合总结和运用!

    aop思想的java代码实现

    这是一个aop思想的实现。配合本博客文章《aop》。其中有3个包,一个没有实现aop,一个用静态代理实现aop,一个使用java的动态代理机制实现aop。

    复习反射利用反射机制和AOP代理模式

    reflection是一系列的API,用于表示或者处理当前JVM中的类,接口和对象. java.lang.reflect/java.lang.Class 在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

    spring 事务管理例子(TransactionProxyFactoryBean代理机制 和 tx/aop)

    适用企业系统的sturts1.2+spring2.0+jdbc 的架构。 通过TransactionProxyFactoryBean 代理机制和tx/aop两种方式来管理事务的详细demo

    JDK动态代理(AOP)使用及原理分析视频教程课件

    动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...

    AOP技术及其在J2EE中动态代理实现

    术解决在软件开发中OOP难以解决的问题以及提高开发效率,利用JAVA的反射机制,研究了AOP的动态代理实现原 理,说明了其可行性,体现了AOP技术应用价值和发展前景。 关键词:AOP;动态代理;横切关注点

    aop思想的java实现

    aop思想的java代码实现。代码分三个部分,一个是不使用aop思想实现日志记录,一个是使用静态代理实现aop,最后是使用java 1.3之后的动态代理机制实现。

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    您将了解如何使用Java的反射机制来创建代理对象,以及如何将横切逻辑注入到目标方法中。我们还提供了实际示例,演示如何在Spring AOP中使用JDK动态代理。 CGLib动态代理: 我们将深入研究CGLib动态代理,它允许您在...

    spring aop注解版

    Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,AOP的原理就是java的动态代理机制

    深入解析Spring AOP源码:从原理到实现,全方位掌握Java AOP编程精髓

    Spring AOP主要基于动态代理模式,它允许开发者在不改变原有代码结构的情况下,增加额外的行为。这主要通过定义“切面(Aspects)”和“通知(Advices)”来实现,其中切面定义了何时以及如何插入额外的行为,而通知...

    spring aop管理xml版

    Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,AOP的原理就是java的动态代理机制

Global site tag (gtag.js) - Google Analytics