spring动态代理

接下来我们来体会下动态代理带给我们的便利

package aop006;

public interface Girl {
    public void KFC(String datetime);
    public void meet(String datetime);
}
package aop006;

/*
 *
 */
public class Girl1 implements Girl{

    public void KFC(String datetime){

        System.out.println("[核心业务逻辑]我是第一个女孩");
        System.out.println("[核心业务逻辑]"+datetime+"吃肯德基");
    }

    public void meet(String datetime){

        System.out.println("[核心业务逻辑]我是第一个女孩");
        System.out.println("[核心业务逻辑]"+datetime+"约会");

    }

}
package aop006;

/*
 *
 */
public class Girl2 implements Girl {

    public void KFC(String datetime){
        System.out.println("[核心业务逻辑]我是第二个女孩");
        System.out.println("[核心业务逻辑]"+datetime+"吃肯德基");
    }

    public void meet(String datetime){
        System.out.println("[核心业务逻辑]我是第二个女孩");
        System.out.println("[核心业务逻辑]"+datetime+"约会");
    }

}
package aop006;

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

public class GirlHandler implements InvocationHandler {
    /*
     * 返回的是原来目标方法所返回的内容
     */
    private Object target;
    public GirlHandler(Object target){
        this.target=target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //前置任务
        before();
        //具体业务逻辑代码
        Object returnValue=method.invoke(target, args);
        //后置任务
        after();
        return returnValue;
    }
    public void before(){
        //前置任务
        System.out.println("【代理前置】洗澡");
        System.out.println("【代理前置】化妆");
        System.out.println("【代理前置】穿衣服");
        System.out.println("*****************");
    }
    public void after(){
        //后置任务
        System.out.println("*****************");
        System.out.println("【代理后置】卸妆");
        System.out.println("【代理后置】洗澡");
        System.out.println("【代理后置】睡觉");
    }

}

从这个代理类我们可以发现如果我们要改非业务代码时只需要改一次。

package aop006;

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

/*
 * 增加一个代理类,类似与明星的经纪人
 * 把核心的业务逻辑的代码 和 非核心的 分离
 * 把非核心的代码交给经纪人(proxy)去管理,
 * 注意:经纪人和要明星,必须实现同一个接口
 */
public class Test {

    public static void main(String[] args) {
        //1.创建目标实现类的实例
        Girl g1 = new Girl1();
        Girl g2 = new Girl2();

        //2.创建一个动态的代理类
        InvocationHandler handler1=new GirlHandler(g1);
        InvocationHandler handler2=new GirlHandler(g2);

        //创建一个动态代理
        Girl girlProxy1=(Girl)Proxy.newProxyInstance(g1.getClass().getClassLoader(), g1.getClass().getInterfaces(),handler1);
        girlProxy1.KFC("周六");
        girlProxy1.meet("周六");
        Girl girlProxy2=(Girl)Proxy.newProxyInstance(g1.getClass().getClassLoader(), g2.getClass().getInterfaces(),handler2);
        girlProxy2.KFC("周日");
        girlProxy2.meet("周日");
        /*g1.KFC("周六");
        g1.meet("周日");

        g2.KFC("周六");
        g2.meet("周日");*/
    }

}

运行结果如下:

截图没截完我相信聪明的你一定知道没截完的是如何的。

接下来会介绍使用配置文件实现动态代理。

时间: 2024-10-05 12:45:17

spring动态代理的相关文章

快速学会Spring动态代理原理

本文主要是讲述快速学会Spring动态代理原理,更多Java技术知识,请登陆疯狂软件教育官网. 一.为什么要使用动态代理 当一个对象或多个对象实现了N中方法的时候,由于业务需求需要把这个对象和多个对象的N个方法加入一个共同的方法,比如把所有对象的所有方法加入事务这个时候有三种方法: 方法一:一个一个对象一个一个方法去加,很显然这个方法是一个比较笨的方法. 方法二:加一个静态代理对象将这个静态代理对象实现要加事务对象的接口.然后在静态代理对象里面每个方法里面加上事务. 方法三:使用动态代理对象,进

spring动态代理的cglib方法

1.被代理类Person.java 1 package com.xiaostudy; 2 3 /** 4 * @desc 被代理类 5 * 6 * @author xiaostudy 7 * 8 */ 9 public class Person { 10 11 public void add() { 12 System.out.println("add()>>>>>>>>"); 13 } 14 15 public void update(

Spring 动态代理 之 but was actually of type 'com.sun.proxy.$Proxy14 Exception

今天在写Spring的引介代理的时候,报了一个错: Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'inter1' is expected to be of type 'com.dengchengchao.springtest.intertest.Inter1Impl' but was actually of type 'co

Spring 动态代理基础知识

Spring AOP 使用动态代理技术在运行期织入增强的代码,为了揭示 Spring AOP 底层的工作机理,有必要学习涉及的 Java 知识.Spring AOP 使用了两种代理机制:一种是基于 JDK 的动态代理:另一种是基于 CGLib 的动态代理.之所以需要两种代理机制,很大程度上是因为 JDK 本身只提供接口的代理,而不支持类的代理. 1.带有横切逻辑的实例 下面通过具体化代码实现一个性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类

关于Spring动态代理

默认情况下,spring会按照如下规则生成代理: 当类有实现接口,spring会生成JdkDynamicAopProxy代理 当类没有实现接口,spring会生成CglibAopProxy代理 如果想强制spring生成CglibAopProxy代理,可以<aop:config proxy-target-class="true"> </aop:config> 当需要使用CGLIB代理和@AspectJ自动代理支持,请按照如下的方式设置 <aop:aspec

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手

CgLib动态代理学习【Spring AOP基础之一】

如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发现其参数类型是ClassLoader classLoader, Class<?>[] interface, InvocationHandler handler, 只支持根据接口实现代理类,如果所有代码都是自己掌控,当然没有问题.所有的业务逻辑均抽象出接口,然后所有的业务类实现接口,这样所有的业务类

WebServcie结合Spring结合动态代理进行抽象封装以及性能优化

webService抽象客户端封装.动态代理提升使用性能 1. 什么是webService webService就是在web上提供非相关系统与系统之间进行数据交互的一种服务.通过实现定义好的wsdl借口配置文件,进行约定以及调用. 在企业的内部系统中很常见,尤其是比较大型的企业,有数十种内部使用的系统,之间的通信基本上都是使用webService. 通俗点说就是:你要调用别人的服务,你就通过wsdl生成客户端代码,方便进行直接调用. 你需要被别人调用,你就通过wsdl生成服务端代码,方便对方系统