栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring之动态代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331949.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号