Spring之动态代理

Spring之动态代理,第1张

Spring之动态代理 动态代理

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

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

文章目录
    • 动态代理
      • 1 工具类
      • 2 接口
      • 3 接口实现类
      • 4 测试类

首先了解两个类:

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();
    }
}

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/3976611.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-10-21
下一篇2022-10-21

发表评论

登录后才能评论

评论列表(0条)

    保存