`

代理模式、静态代理、动态代理、aop

 
阅读更多

    首先要解释一下什么是代理模式:网上看了好多关于代理的解释我感觉都不是太令人满意,按照我个人的理解,代理模式的作用其实就是为一个对象提供一种代理以控制这个对象,然后把这个代理提供给别人来使用。代理模式会在那些情况下使用呢?在某些情况下,一个客户不想或者不能直接引用或者说在引用目标对象前后要进行一些额外的工作时候,代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式的角色有3种:

抽象角色:声明真实对象和代理对象的共同接口;

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作前后,附加其他的操作,相当于对真实对象进行封装一些额外的服务。

真实角色:代理角色所代表的真实对象,是代理最终要引用的对象。

静态代理:代理类中引用实在的被代理类;动态代理:代理类中不引用实在的被代理类,动态注入。

静态代理的实例:

抽象角色:UserDAO

publicinterface UserDAO {

    publicvoid saveUser(User user);

}

真实角色:UserDAOImp

publicclass UserDAOImp implements UserDAO {

    publicvoid saveUser(User user) {

       }

}

代理角色:UserDAOProxy

publicclass UserDAOProxy implements UserDAO {

    private UserDAO userDao;

    UserDAOProxy(UserDAO userDao){

       this.userDao = userDao;

    }

    publicvoid saveUser(User user) {

       beforeSaveUser();

       userDao.saveUser(user);

       afterSaveUser();

    }

    privatevoid afterSaveUser() {

    }

    privatevoid beforeSaveUser() {

    }

}

运行:

 publicclass TestUserDAOProxy {

    publicstaticvoid main(String[] args) {

       UserDAO userDAO = new UserDAOImp();

       UserDAO proxy = new UserDAOProxy(userDAO);

       User user = new User();

       proxy.saveUser(user);

    }

}

 动态代理的实例:

抽象角色:

publicinterface HelloWorld {

    publicvoid sayHello();

}

真实角色:

publicclass HelloWorldImpl implements HelloWorld {

    publicvoid sayHello() {

       System.out.println("hello world");

    }

}

Handler

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

       Object obj;

       HelloWorldHandler(Object obj) {

              this.obj = obj;

       }

       public Object invoke(Object obj1, Method method, Object[] args)

                     throws Throwable {

              this.doBefore();

              Object o = method.invoke(obj, args);

              this.doAfter();

              return null;

       }

       public void doBefore() {

              System.out.println("do this before");

       }

       public void doAfter() {

              System.out.println("do this after");

       }

}

具体调用:

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Proxy;

publicclass TestProxy {

    publicstaticvoid main(String[] args) throws IllegalArgumentException,

           InstantiationException, IllegalAccessException,

           InvocationTargetException {

       HelloWorld hw1 = new HelloWorldImpl();

       HelloWorldHandler hh = new HelloWorldHandler(hw1);

       HelloWorld proxy1 = (HelloWorld) Proxy.newProxyInstance(hw1.getClass()

              .getClassLoader(), hw1.getClass().getInterfaces(), hh);

//proxy1就是动态代理,这样就减少了代理和添加业务方法的耦合,具体业务以及添加的业务在handler里面已经实现

       proxy1.sayHello();

       hw1.sayHello();

    }

}

从此可以看出动态代理是基于interface classloader动态创建一个代理对象,如果你能理解这点就很容易理解spring aop

看下面一段代码,来源于spring in action

<beans>

    <bean id="quest"

       class="com.springinaction.chapter01.knight.HolyGrailQuest" />

    <bean id="knightTarget"

       class="com.springinaction.chapter01.knight.KnightOfTheRoundTable">

       <constructor-arg>

           <value>Bedivere</value>

       </constructor-arg>

       <property name="quest">

           <ref bean="quest" />

       </property>

    </bean>

    <bean id="minstrel"

       class="com.springinaction.chapter01.knight.MinstrelAdvice" />

    <bean id="knight"

       class="org.springframework.aop.framework.ProxyFactoryBean">

       <property name="proxyInterfaces">

           <list>

              <value>

                  com.springinaction.chapter01.knight.Knight

              </value>

              <value>

                  com.springinaction.chapter01.knight.Knight2

              </value>  

           </list>

       </property>

       <property name="interceptorNames">

           <list>

              <value>minstrel</value>

           </list>

       </property>

       <property name="target">

           <ref bean="knightTarget" />

       </property>

    </bean>

</beans>

       BeanFactory factory = new XmlBeanFactory(new ClassPathResource(

              "applicationContext.xml"));

       Knight knight = (Knight) factory.getBean("knight");

//knight就是一个动态代理对象!

knight.embarkOnQuest();

看到上面的配置文件,然后再看一下动态代理,你会发现spring aop就是基于动态代理模式来实现的

分享到:
评论

相关推荐

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

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

    AOP动态代理(反射机制)

    6. **代理模式的其他实现**:除了Java的动态代理,还有其他实现方式,比如CGLIB库,它通过字节码生成技术创建代理对象,即使目标类没有实现接口也能进行代理。 学习AOP动态代理有助于我们理解面向切面编程的核心...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了软件工程中的开闭原则。 - **...

    代理模式的各种实现 (动态代理、静态代理)

    代理模式在Java中主要有两种实现方式:静态代理和动态代理,其中动态代理又分为JDK动态代理和CGlib代理。 1. 静态代理 静态代理是程序员手动创建代理类并实现与目标类相同接口的方式。在静态代理中,代理类和目标类...

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

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

    Spring模拟aop静态代理案例

    本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    Java Spring代理模式AOP-IOC分析

    代理模式可以分为静态代理和动态代理两种。静态代理是通过手动编写代理类来实现代理的,而动态代理则是通过使用代理工厂或代理类生成器来生成代理对象。 二、静态代理 静态代理是通过手动编写代理类来实现代理的。...

    代理模式(含动态代理讲解)【Spring AOP实质】

    在Java中,代理模式主要有两种实现方式:静态代理和动态代理。 1. 静态代理: 在静态代理中,我们需要手动创建一个代理类,这个代理类实现了与目标类相同的接口。代理类中会持有目标对象的引用,并在调用目标对象...

    Spring AOP的静态代理和动态代理,转移到调用处理器一个集中的方法中处理.docx

    【Spring AOP的静态代理和动态代理】 在软件开发中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,对对象的行为进行增强。代理模式的核心思想是通过代理对象来控制对原始对象(也称为委托...

    java Spring代理模式AOP-IOC结合

    Java Spring 代理模式 AOP-IOC 结合 从给定的文件信息中,我们可以总结出以下知识点: 一、为什么需要代理模式 在软件开发中,我们经常会遇到一些非功能性需求,如日志记录、身份验证、性能监控等,这些需求会...

    Java代理模式模板代码,包含动态代理与静态代理

    总结,Java代理模式提供了两种实现方式,静态代理适用于代理类数量较少且不需要频繁改动的情况,而动态代理则更加灵活,适用于代理类数量多或者需要动态改变代理行为的场景。了解并熟练运用这两种代理模式,可以极大...

    (入门)什么是AOP?什么是代理模式?怎么设计日志拦截器?

    静态代理是在编译时就已经确定了代理类,而动态代理则是在运行时动态创建的。Java中,JDK的Proxy类和CGLIB库可以实现动态代理。 日志拦截器是AOP的一个常见应用场景。在Spring框架中,我们可以利用AOP和代理模式来...

    Spring AOP里的静态代理和动态代理用法详解

    静态代理和动态代理都是 Spring AOP里的重要概念,都是实现代理模式的不同方式。静态代理适合于小规模的项目,动态代理适合于大规模的项目。 Spring AOP里的静态代理和动态代理用法详解对大家的学习或者工作具有一定...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

    springAOP之代理模式.docx

    代理模式主要有两种形式:静态代理和动态代理。 1. **静态代理** 静态代理在程序运行前就已经存在,代理类和被代理类的关系是明确的。实现过程包括: - 定义一个公共接口,被代理类和代理类都实现该接口。 - 被...

    动态代理设计模式 日志和源码

    动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...

    Spring的静态代理和动态代理

    本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...

Global site tag (gtag.js) - Google Analytics