Spring 动态代理

1.创建接口让实现类实现实现功能的累积扩展

接口可以 写多个 , 实现功能的扩展

package cn.itsource._07_proxy_dynamic;

public interface ITicket {

    /**
     * 订票
     */
    void order();

}
package cn.itsource._07_proxy_dynamic;

/**
 * 抽象主题角色
 */
public interface IRent {

    /**
     * 收租
     */
    void rent();

    /**
     * 签合同
     */
    void asign();

}

 

2.创建编写实现类实现接口

package cn.itsource._07_proxy_dynamic;

/**
 * 房东:真实主题角色
 */
public class Landlord implements IRent,ITicket{

    public void rent() {
        System.out.println("房东收租金");
    }

    public void asign() {
        System.out.println("房东签合同");
    }

    public void order() {
        System.out.println("火车票预定");
    }
}

 

3.创建编写代理类,传入实体类调用方法

package cn.itsource._07_proxy_dynamic;

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

public class MyInvocationHandler implements InvocationHandler {

    //被代理对象
    private Object target;

    public MyInvocationHandler(Object target){
        this.target = target;
    }

    /**
     * 执行代理业务
     * @param proxy     代理对象【不用】
     * @param method    调用的被代理对象的方法对象
     * @param args      调用的被代理对象的方法的实参列表
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法调用之前插入业务逻辑
        System.out.println("方法调用之前插入业务逻辑");
        //使用反射技术调用被代理对象的该方法
        Object result = method.invoke(target, args);
        //方法调用之后插入业务逻辑
        System.out.println("方法调用之后插入业务逻辑");
        return result;
    }
}

4. 创建编写测试类

 

package cn.itsource._07_proxy_dynamic;

import org.junit.Test;

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

public class DynamicProxyTest {

    @Test
    public void test() throws Exception{

        /**
         * ClassLoader loader 类加载器
         * Class<?>[] interfaces 被代理对象实现的所有接口形成的数组
         * InvocationHandler h 执行处理器
         */
//        ClassLoader loader = DynamicProxyTest.class.getClassLoader();
        ClassLoader loader = Thread.currentThread().getContextClassLoader();


        //创建一个被代理对象(真实主题角色)
        IRent rent = new Landlord();
        //获取被代理对象类实现过的所有接口,返回一个数组
        Class<?>[] interfaces = rent.getClass().getInterfaces();

        //执行处理器
        InvocationHandler h = new MyInvocationHandler(rent);


        //调用JDK自带的动态代理技术生成代理对象
        IRent proxy = (IRent)Proxy.newProxyInstance(loader, interfaces, h);

        System.out.println(proxy);
        System.out.println(proxy.getClass());

        proxy.asign();
        proxy.rent();

    }


}

貌似后面还有更方便地实现方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值