`

AOP之代理篇

阅读更多
相关文章: X
java 动态代理的一点迷惑
现看静态代理:
Java代码
package proxy.demo2;  
 
public interface Subject {  
    public void request();  


package proxy.demo2;

public interface Subject {
    public void request();
}


Java代码
package proxy.demo2;  
 
public class RealSubject implements Subject{  
 
    public void request() {  
        // TODO Auto-generated method stub  
        System.out.println("invoke request is RealSubject.request");  
    }  
      


package proxy.demo2;

public class RealSubject implements Subject{

public void request() {
// TODO Auto-generated method stub
System.out.println("invoke request is RealSubject.request");
}
   
}

Java代码
package proxy.demo2;  
 
/** 
* @author spark 
* 代理接口:Subject ; 
* 真实的被代理对象:RealSubject(实现那subject接口); 
* 代理对象:ProxySubjet; 
* 这里的有几点需要注意的 
* 1:RealSubject是存在的。也就是说ProxySubject 
* 事先是知道代理的对象是谁(这里指的是RealSubject); 
* 故是一种静态代理;而所谓的Dynamic Proxy是事先不知道被代理的对象的存在, 
* 也就是知道被代理的对象是实现了某个接口的;也就是说真正被代理的对象是动态 
* 产生的。 
* 2:所谓的代理对象只不过是被代理对象的加强版对象 
* 说白那就是RealSubject对象有的功能(说到“功能”两字,大家的脑袋应该立马联想到接口(interface)), 
* ProxySubject都具有;故当RealSubject实现那Subject,那么ProxySubject也要实现Subject接口; 
* 并且在ProxySubject实现的request()方法中其实是调用那RealSubject的request()方法; 
* 当然ProxySubject的request()方法也可是RealSubject的request()方法的加强版;可以在 
* RealSubject.request()方法之前或之后做一些事情 
* 3:由1,2二点可以看出 
* “如果要按照上述的方法使用代理模式,那么真实角色(被代理对象)必须是事先已经存在的, 
* 并将其作为代理对象的内部属性。但是实际使用时,一个真实角色(被代理对象)必须对应一个代理角色(代理对象), 
* 如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢? 
* 这个问题引出了Java了一个很有趣的机制--动态代理。” 
* ----------------上面引用于“http://aladdin.iteye.com/blog/40998” 
* 呵呵,希望大家尊重原创,我也是看了aladdin的文章才有所启发的,谢谢aladdin的精彩文章; 
* 只是aladdin有些话太高深,我翻译成大白话,方便以后自己学习; 
* 希望aladdin不要介意 
*/ 
public class ProxySubject implements Subject {  
    private RealSubject realsubject;  
    public ProxySubject(RealSubject realsubject){  
        this.realsubject=realsubject;  
    }  
    public void request() {  
        // TODO Auto-generated method stub  
         this.beforRequest();  
         realsubject.request();//这句话才是“代理”二字的真实含义,实际上调用的RealSubject类对象的request();  
         this.afterRequest();  
    }  
    //在RealSubject.request()调用之前做一些事情  
    private void beforRequest(){  
        System.out.println("befor RealSubject.request()");  
    }  
    //在RealSubject.request()调用之后做一些事情  
    private void afterRequest(){  
        System.out.println("after RealSubject.request()");  
    }  


package proxy.demo2;

/**
* @author spark
* 代理接口:Subject ;
* 真实的被代理对象:RealSubject(实现那subject接口);
* 代理对象:ProxySubjet;
* 这里的有几点需要注意的
* 1:RealSubject是存在的。也就是说ProxySubject
* 事先是知道代理的对象是谁(这里指的是RealSubject);
* 故是一种静态代理;而所谓的Dynamic Proxy是事先不知道被代理的对象的存在,
* 也就是知道被代理的对象是实现了某个接口的;也就是说真正被代理的对象是动态
* 产生的。
* 2:所谓的代理对象只不过是被代理对象的加强版对象
* 说白那就是RealSubject对象有的功能(说到“功能”两字,大家的脑袋应该立马联想到接口(interface)),
* ProxySubject都具有;故当RealSubject实现那Subject,那么ProxySubject也要实现Subject接口;
* 并且在ProxySubject实现的request()方法中其实是调用那RealSubject的request()方法;
* 当然ProxySubject的request()方法也可是RealSubject的request()方法的加强版;可以在
* RealSubject.request()方法之前或之后做一些事情
* 3:由1,2二点可以看出
* “如果要按照上述的方法使用代理模式,那么真实角色(被代理对象)必须是事先已经存在的,
* 并将其作为代理对象的内部属性。但是实际使用时,一个真实角色(被代理对象)必须对应一个代理角色(代理对象),
* 如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?
* 这个问题引出了Java了一个很有趣的机制--动态代理。”
* ----------------上面引用于“http://aladdin.iteye.com/blog/40998”
* 呵呵,希望大家尊重原创,我也是看了aladdin的文章才有所启发的,谢谢aladdin的精彩文章;
* 只是aladdin有些话太高深,我翻译成大白话,方便以后自己学习;
* 希望aladdin不要介意
*/
public class ProxySubject implements Subject {
    private RealSubject realsubject;
    public ProxySubject(RealSubject realsubject){
    this.realsubject=realsubject;
    }
public void request() {
// TODO Auto-generated method stub
         this.beforRequest();
         realsubject.request();//这句话才是“代理”二字的真实含义,实际上调用的RealSubject类对象的request();
         this.afterRequest();
}
//在RealSubject.request()调用之前做一些事情
    private void beforRequest(){
    System.out.println("befor RealSubject.request()");
    }
    //在RealSubject.request()调用之后做一些事情
    private void afterRequest(){
    System.out.println("after RealSubject.request()");
    }
}


看测试类
Java代码
package proxy.demo2;  
 
public class 测试静态代理 {  
 
    /** 
     * @param args 
     */ 
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
           Subject proxy=new ProxySubject(new RealSubject());  
           //Subject proxy=new ProxySubject(new RealSubject());这行代码  
           //也体现那proxy是静态代理,因为它知道该实例化那个代理对象;  
           proxy.request();  
    }  
 


package proxy.demo2;

public class 测试静态代理 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
           Subject proxy=new ProxySubject(new RealSubject());
           //Subject proxy=new ProxySubject(new RealSubject());这行代码
           //也体现那proxy是静态代理,因为它知道该实例化那个代理对象;
           proxy.request();
}

}

再看动态代理
Java代码
package proxy.demo2;  
 
import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
 
public class DynamicProxy implements InvocationHandler {  
    private Subject subject;  
    public DynamicProxy(Subject subject){  
        this.subject=subject;  
    }  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        // TODO Auto-generated method stub  
        this.beforRequest();  
        method.invoke(subject, args);  
        this.afterRequest();  
        return null;  
    }  
//  在RealSubject.request()调用之前做一些事情  
    private void beforRequest(){  
        System.out.println("befor RealSubject.request()");  
    }  
    //在RealSubject.request()调用之后做一些事情  
    private void afterRequest(){  
        System.out.println("after RealSubject.request()");  
    }  


package proxy.demo2;

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

public class DynamicProxy implements InvocationHandler {
    private Subject subject;
    public DynamicProxy(Subject subject){
    this.subject=subject;
    }
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
this.beforRequest();
method.invoke(subject, args);
this.afterRequest();
return null;
}
// 在RealSubject.request()调用之前做一些事情
    private void beforRequest(){
    System.out.println("befor RealSubject.request()");
    }
    //在RealSubject.request()调用之后做一些事情
    private void afterRequest(){
    System.out.println("after RealSubject.request()");
    }
}



看测试类:
Java代码
package proxy.demo2;  
import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Proxy;  
 
import proxy.Secretary;  
public class 测试动态代理 {  
 
    /** 
     * @param args 
     *  Subject is Interface 
     *  get Subject instance; 
     *  Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), 
     *        new Class[] { Foo.class }, handler); 
     */ 
      
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
       RealSubject real=new RealSubject();  
       InvocationHandler handler=new DynamicProxy(real);  
       Subject proxy= (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(), new Class[]{Subject.class}, handler);  
       proxy.request();  
    }  
 

分享到:
评论

相关推荐

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

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    Java动态代理(Spring Aop原理)

    这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入探讨相关知识点。 首先,Java动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类会代理原始类,并...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...

    Spring-AOP-JDK动态代理

    本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...

    通过动态代理模拟Spring AOP

    本篇文章将详细探讨如何通过Java的动态代理机制来模拟Spring AOP的核心概念。 首先,让我们了解什么是动态代理。在Java中,动态代理主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...

    JavaEE spring半自动实现AOP代理

    本篇将深入探讨如何在Spring中半自动地实现AOP代理。 首先,理解AOP的概念是至关重要的。AOP通过将关注点(如日志)与核心业务逻辑分离,提高了代码的可读性和可维护性。在Spring中,AOP代理有两种实现方式:JDK...

    模拟spring aop【一】基于jdk动态代理实现的aop

    本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...

    从JDK动态代理到spring AOP

    本篇将详细探讨JDK动态代理和Spring AOP,以及它们在实际应用中的作用。 首先,JDK动态代理是Java提供的一种在运行时创建代理对象的技术。它允许我们在不修改原有类的基础上,为已有接口添加额外的功能。动态代理的...

    spring使用动态代理面向切面编程(AOP) xml

    本篇文章将深入探讨如何使用Spring的动态代理机制实现AOP,以及XML配置的相关知识。 一、面向切面编程(AOP) AOP的核心概念是切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和织入...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经...总之,通过本篇文章的学习,读者应该能够理解和掌握如何使用Java动态代理来实现AOP的基本原理及实践操作。

    动态代理实现aop

    本篇文章主要介绍了如何利用Java动态代理技术实现AOP的基本原理及其在实际开发中的应用。 #### AOP核心概念 AOP的核心概念包括: - **切面(Aspect)**:一个关注点的模块化,它可以跨越多个对象的行为。例如,...

    仿springAOP框架

    在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱,其中AOP(面向切面编程)是其核心特性之一。AOP允许开发者将关注点从主业务逻辑中分离出来,如日志记录、事务管理等,实现代码的模块化和可复用性...

    Java实现aop案例

    这篇博客文章《Java实现aop案例》可能详细介绍了如何在Java项目中使用Spring AOP来实现面向切面编程。虽然没有具体的描述,但我们可以根据标题推测文章可能会涵盖以下内容: 1. **AOP基本概念**:介绍AOP的核心概念...

    Spring中的AOP不生效

    AOP不生效的问题通常涉及多个方面,需要从配置、代理模式选择、类管理等多个角度进行排查。本篇文章提供了较为全面的解决方案,希望能帮助开发者快速定位并解决问题。在实际开发中,还需要结合具体情况灵活应用这些...

    Spring AOP之增强

    当我们的bean需要被AOP代理时,需要将其声明为`@Component`或在配置文件中声明,并且开启AOP代理。 此外,对于复杂的切面逻辑,我们可以使用AspectJ的注解或者XML配置来定义,AspectJ提供了更强大的功能,如支持...

    spring-aop AND proxy

    标签“源码”意味着这篇博客可能深入解析了Spring AOP的内部工作机制,包括如何通过代理机制实现切面的织入,以及Spring AOP的相关核心类如`Advised`、`ProxyFactoryBean`、`DefaultAdvisorAdapterRegistry`等。...

    Spring AOP依赖jar包

    本篇文章将详细介绍 Spring AOP 的核心概念、如何配置以及所依赖的 Jar 包,特别是 `AspectJ 1.6.12` 版本。 1. **AOP 概念** - **切面(Aspect)**:切面是关注点的模块化,如日志、事务管理等,它们横切多个对象...

    C# AOP帮助类

    本篇将详细介绍C# AOP帮助类的设计与应用。 AOP的核心概念包括切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和织入(Weaving)。切面是封装横切关注点的模块;连接点是在程序执行过程...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    三、Spring AOP代理原理 Spring AOP通过两种代理机制实现: 1. JDK动态代理:只能代理实现了接口的目标对象,性能相对较低,需要指定代理接口。 2. CGLIB代理:可代理接口和非final的类,性能较高,通过生成字节...

    Spring实现AOP的4种方式

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

Global site tag (gtag.js) - Google Analytics