`

Javaweb-动态代理之代理工厂模式实现

 
阅读更多

前面做了一个Waiter的动态代理的练习,这篇继续来写一个练习,一个动态代理工厂的例子,这个例子在以后学习Spring的时候会有帮助。这个动态工厂的主要作用就是包装了下目标对象和前置增强和后置增强。

 

 

工厂类的使用步骤

我们要设计一个动态代理工厂类,以下是使用这个工程类的步骤。

来源:凯哥Java(kaigejava)

1. 创建代理工厂

2. 给工厂设置三样东西

1) 目标对象,调用方法setTargetObject()

2) 前置增强,调用setBeforeAdvice(该接口的具体实现)

3) 后置增强,调用setAfterAdvice(该接口的具体实现)

3. 调用createProxy方法得到代理对象

执行代理对象方法时,按照以下顺序执行。

1) 执行BeforeAdvice的before方法

2) 执行目标对象的目标方法

3) 执行AfterAdvice的after方法

 

前提准备

新建一个包,把前面的Waiter.java 和ManWaiter.java拷贝过来。

 

创建动态代理工厂类

这里我们的代理工厂类,先给出目标对象,前置增强和后置增强,然后创建set和get方法。

下面是前置增强接口代码

package demo1;

 

/**

*     前置增强  

* @author anthony

*

*/

public interface BeforeAdvice {

    

    public void before();

}

 

下面是后置增强接口代码

package demo1;

 

/**

*    后置增强

* @author anthony

*

*/

public interface AfterAdvice {

    public void after();

}

 

这里面,我们暂时不知道程序员会在前置增强和后置增强写什么具体代码,所以这里我们利用接口来实现,程序员到时候写代码的时候,前置增强必须要实现前置增强接口中的before方法,后置增强必须实现后置增强接口中的after方法。

 

下面是代理工厂类的代码

package demo1;

 

/**

*     这个类用来生成代理对象

*     需要所有参数

*     *目标对象

*     *增强

* @author anthony

*

*/

public class ProxyFactory {

    

    private Object targetObject; // 目标对象

    private BeforeAdvice beforeAdvice; // 前置增强

    private AfterAdvice afterAdvice; // 后置增强

    

    

    public Object getTargetObject() {

        return targetObject;

    }

    public void setTargetObject(Object targetObject) {

        this.targetObject = targetObject;

    }

    public BeforeAdvice getBeforeAdvice() {

        return beforeAdvice;

    }

    public void setBeforeAdvice(BeforeAdvice beforeAdvice) {

        this.beforeAdvice = beforeAdvice;

    }

    public AfterAdvice getAfterAdvice() {

        return afterAdvice;

    }

    public void setAfterAdvice(AfterAdvice afterAdvice) {

        this.afterAdvice = afterAdvice;

    }

}

 

这里三个对象都给生成set和get方法,方便调用。

 

创建代理对象

前面代码都不是重点,我们代理工厂重点部分来了,就是如何创建代理对象。这部分是在工厂类中,实现createProxy()方法,是本篇的重点内容,代码如下。

package demo1;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

 

import org.omg.CORBA.portable.InvokeHandler;

 

/**

*     这个类用来生成代理对象

*     需要所有参数

*     *目标对象

*     *增强

* @author anthony

*

*/

public class ProxyFactory {

    

    private Object targetObject; // 目标对象

    private BeforeAdvice beforeAdvice; // 前置增强

    private AfterAdvice afterAdvice; // 后置增强

    

    /**

     *    生成代理对象

     * @return

     */

    public Object createProxy() {

        // 1. 给出三大参数

        ClassLoader loader = this.getClass().getClassLoader();

        Class[] interfaces = targetObject.getClass().getInterfaces();

        InvocationHandler h = new InvocationHandler() {

            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                // 执行前置增强

                if(beforeAdvice != null) {

                    beforeAdvice.before();

                }

                // 执行目标对象目标方法

                Object result = method.invoke(targetObject, args);

                // 执行后置增强

                if(afterAdvice != null) {

                    afterAdvice.after();

                }

                return result;

            }

        };

        

        // 2. 得到代理对象

        Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);

        return proxyObject;

    }

    

    public Object getTargetObject() {

        return targetObject;

    }

    public void setTargetObject(Object targetObject) {

        this.targetObject = targetObject;

    }

    public BeforeAdvice getBeforeAdvice() {

        return beforeAdvice;

    }

    public void setBeforeAdvice(BeforeAdvice beforeAdvice) {

        this.beforeAdvice = beforeAdvice;

    }

    public AfterAdvice getAfterAdvice() {

        return afterAdvice;

    }

    public void setAfterAdvice(AfterAdvice afterAdvice) {

        this.afterAdvice = afterAdvice;

    }

}

 

上面代码就是在createProxy()方法的时候,把目标对象和增强给做了以下组装。接下来,看看如何代码使用这个工厂类。

 

测试工厂类的使用

新建一个Demo1.java文件,写代码来使用ProxyFactory这个动态代理工厂类。

package demo1;

 

import org.junit.Test;

 

public class Demo1 {

    

    @Test

    public void fun1() {

        // 1. 创建工厂类对象

        ProxyFactory factory = new ProxyFactory();

        // 2.设置目标对象

        factory.setTargetObject(new ManWaiter());

        // 3.设置前置增强

        factory.setBeforeAdvice(new BeforeAdvice() {

            public void before() {

                System.out.println("你好,欢迎光临!");

            }

        });

        // 4.设置后置增强

        factory.setAfterAdvice(new AfterAdvice() {

            public void after() {

                System.out.println("再见,欢迎下次再来!");

            }

        });

        

        // 5. 获取代理对象, 执行增强代码

        Waiter waiter = (Waiter)factory.createProxy();

        waiter.serve();

    }

 

}

 

运行单元测试,得到如下输出。

联系凯哥:凯哥Java(kaigejava)

凯哥个人博客:www.kaigejava.com

个人博客上可以发即时消息给凯哥哦~

你好,欢迎光临!

服务中...

再见,欢迎下次再来!

分享到:
评论

相关推荐

    javaweb项目+设计模式(单例模式,工厂模式,动态代理,适配器)

    在这个`CloudMusic`项目中,可以预见的是,单例模式可能被用来管理数据库连接,工厂模式用于根据需求创建不同的音乐播放器对象,动态代理可能用于实现用户行为的日志记录或权限控制,而适配器模式则可能用于集成第三...

    基于JavaWeb的物业管理系统

    能学到什么:①工厂模式、策略模式、观察者模式等都是怎么在Spring中体现的;②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发java web 学习其原理和内核,不仅是代码编写实现也更...

    Java与模式PDF

    这本书主要涵盖了23种GOF(GoF,Gang of Four)经典设计模式,包括创建型模式(如单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式)、结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合...

    JavaWeb牛牛面粉厂管理系统

    1. **Struts2**:Struts2是MVC(Model-View-Controller)设计模式的实现,负责处理用户的请求,控制应用的流程。在牛牛面粉厂管理系统中,Struts2作为前端控制器,接收HTTP请求,根据配置文件决定调用哪个Action进行...

    《Java设计模式》课程标准2018

    - 创建型模式:涵盖了单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式。 - 结构型模式:包括代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式。 - 行为型模式:涉及模板...

    JavaWeb面试题

    - 常见的23种设计模式及其应用场景,如单例、工厂、装饰、代理、观察者等模式。 10. **项目经验** - 实际项目中的问题解决、团队协作、版本控制(Git)以及代码质量管理。 以上知识点都是JavaWeb面试中可能涉及...

    毕业设计 Java web项目源码整合开发ssm-javaWeb传智播客网上书城项目源码(设计以及实现论文).rar

    11. **设计模式**:项目中可能应用到单例模式、工厂模式、代理模式等设计模式,提高代码的可读性和可维护性。 通过研究这个项目,不仅可以提升对SSM框架的理解,还能掌握Java Web开发的全流程,包括前端与后端的...

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    pattern/src/creation/abstractfactory //11.2抽象工厂模式 pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 ...

    科帮网javaWeb计算机配件报价系统项目源码.zip

    - **设计模式**:如单例模式、工厂模式等,提高代码可读性和可维护性。 - **单元测试**:使用JUnit或Mockito进行代码测试,确保功能的正确性。 - **代码规范**:遵循一定的编码风格,提升团队协作效率。 以上...

    北京动力节点-专题05-监听器.pdf

    监听器是JavaWeb开发中的一个重要概念,它是一种设计模式的具体实现,主要用于实现Web组件(如Servlet、JSP等)的生命周期事件监听。在本文中,我们将深入了解监听器的概念、分类以及如何在JavaWeb开发中应用监听器...

    JavaWeb商品进货销售系统源代码+数据库,基于SSM框架+mysql

    9. **设计模式**:在SSM架构中,常见的设计模式如单例模式(Spring中的Bean管理)、工厂模式(MyBatis的SqlSessionFactory)和代理模式(Spring的AOP)会被广泛应用,提高代码的可读性和可扩展性。 10. **数据库...

    JavaEE:JavaEE学习代码:设计模式,Tomcat,JavaWeb,SSM,SpringBoot,Redis等

    在JavaEE开发中,常用的设计模式如单例模式、工厂模式、代理模式、装饰器模式、观察者模式等,可以提高代码的可维护性和复用性。 2. **Tomcat服务器**: Tomcat是一个开源的轻量级应用服务器,主要用于运行Java ...

    网上图书商店项目

    在设计模式方面,项目可能运用了单例模式(用于数据库连接池)、工厂模式(用于Action实例化)和策略模式(用于处理不同的业务逻辑)。这些模式提高了代码的灵活性和可扩展性。 最后,考虑到项目的实际部署,可能...

    【电子版】校招面试题库(附答案与解析)java篇-破解密码.pdf

    - 反射:反射是Java强大的特性,允许在运行时检查类的信息并动态调用方法,面试中可能要求实现基于反射的动态代理或操作私有属性。 - JVM:理解JVM内存模型,垃圾收集机制,性能优化策略等,对于解决性能问题至关...

    javaweb,struts,spring,ibatis,hibernate,ajax等API及帮助文档

    Spring的API包括了Bean工厂、ApplicationContext、AOP代理等,它们使得开发者能够轻松管理对象的生命周期,并进行灵活的依赖注入。Spring MVC则提供了DispatcherServlet、ModelAndView等类来处理HTTP请求和响应。 3...

    在线考试管理系统(部分功能)

    *此系统主要是为了实践Spring的相关技术,其中包含:IOC,DI,AOP 以及一些其他的技术:...*涉及到的设计模式有:单例模式,工厂模式,代理模式,模板模式,MVC模式等等 *注意:此系统未提供数据库文件,仅供学习参考

    Java web 购物系统

    5. **设计模式和最佳实践**:在开发购物系统时,常见的设计模式如工厂模式、单例模式、代理模式等会被应用,以提高代码的可读性和可维护性。同时,遵循RESTful API设计原则和模块化开发,可以确保系统的可扩展性和可...

    Spring基础面试

    - **解释**: JDK 动态代理主要用于实现接口的代理,而 CGLIB 则用于实现类的代理,适用于没有实现接口的情况。 #### 10. AOP 的作用是什么?在哪些地方使用 AOP 比较好? - **知识点**: AOP (Aspect-Oriented ...

    java在线拍卖网系统

    项目中可能会应用到多种设计模式,如单例模式(数据库连接池)、工厂模式(对象创建)、策略模式(不同拍卖规则的实现)等,以提高代码的可读性和可复用性。 10. **测试**: 使用JUnit进行单元测试,Mockito模拟...

    JAVA技术体系

    - **动态代理**:理解 Java 动态代理的原理与实现。 - **集合类**:详细介绍 Java 集合框架,包括 List、Set、Map 等。 - **正则表达式**:教授如何使用 Java 进行文本匹配和处理。 - **XML 与属性文件**:讲解 XML ...

Global site tag (gtag.js) - Google Analytics