Spring之动态代理

动态代理

何为动态代理?
相比于传统的静态代理,每一个需要代理的类,我们都需要写一个代理对象进行代理,那么一百个需要代理的类难道我们要写一百个么?

答案是否定的,我们所谓的动态代理就应运而生了;它可以自动的帮我们创建相应的代理类。


首先了解两个类:

Proxy:生成动态代理实例的
setObject()设置需要代理的类型
getProxy()得到代理的对象

InvocationHandler:调用处理程序并返回结果的
invoke()当代理对象pih调用方法的时候

例如pih.add(),此时会自动执行invoke()方法
当然我们可以在invoke()方法中添加我们需要的逻辑实现我们想要的目的,例如我所增加的log(msg)方法,打印当前方法名称。

1 工具类

获取动态代理proxy

package com.xzzlx.demo02;

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

public class ProxyInvovationHandler implements InvocationHandler {
    /**
     * 被代理的接口
     */
    private Object object;

    // 设置代理类型
    public void setObject(Object object) {
        this.object = object;
    }

    // 获取代理对象
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), 
                                      object.getClass().getInterfaces(),
                                      this);
    }

    // 执行代理方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(logName(method.getName()));
        return method.invoke(object, args);
    }

    public String logName(String msg){
        return "执行了" + msg + "方法";
    }

}

2 接口

用户服务接口

package com.xzzlx.demo02;

public interface UserService {
    /**
     * 增加
     */
    void add();

    /**
     * 删除
     */
    void deleted();

    /**
     * 更新
     */
    void update();

    /**
     * 查询
     */
    void select();
}

3 接口实现类

用户接口实现类

package com.xzzlx.demo02;

public class UserServiceImpl implements UserService{
    @Override
    public void add() {
        System.out.println("这是增加");
    }

    @Override
    public void deleted() {
        System.out.println("这是删除");
    }

    @Override
    public void update() {
        System.out.println("这是更改");
    }

    @Override
    public void select() {
        System.out.println("这是查询");
    }
}

4 测试类

用户动态代理测试类

package com.xzzlx.demo02;

import org.junit.jupiter.api.Test;

public class User {
    @Test
    public void test(){
        // 真实对象
        UserService userService = new UserServiceImpl();

        // 代理调用处理程序
        ProxyInvovationHandler pih = new ProxyInvovationHandler();

        // 设置代理对象
        pih.setObject(userService);

		// 这里强转类型是接口的类型,一定要注意!!!
        UserService proxy = (UserService) pih.getProxy();
		
		// 动态代理对象调用方法
        proxy.add();
        proxy.deleted();
        proxy.update();
        proxy.select();
    }
}

有问题可以留言一起讨论~~~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值