动态代理

动态代理

模拟企业业务功能开发,并完成每个功能的性能统计
需求
模拟某企业用户管理业务,需包含用户登录,用户删除,用户查询功能,并要统计每个功能的耗时。
分析
定义一个UserService表示用户业务接口,规定必须完成用户登录,用户删除,用户查询功能。
定义一个实现类UserServiceImpl实现UserService,并完成相关功能,且统计每个功能的耗时。
定义测试类,创建实现类对象,调用方法。

1
2
3
4
5
6
7
8
9
10
11
package com.itheima.d9_proxy;
 
/**
   模拟用户业务功能
 */
public interface UserService {
    String login(String loginName , String passWord) ;
    void selectUsers();
    boolean deleteUsers();
    void updateUsers();
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.itheima.proxy;
 
public class UserServiceImpl implements UserService {
    @Override
    public String login(String loginName, String passWord)  {
        long startTimer = System .currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        long endTimer = System.currentTimeMillis();
        System.out.println("login"+"方法耗时:" + (endTimer - startTimer) / 1000.0 + "s");
        if("admin".equals(loginName) && "1234".equals(passWord)) {
            return "success";
        }
 
        return "登录名和密码可能有毛病";
 
    }
 
    @Override
    public void selectUsers() {
        long startTimer = System .currentTimeMillis();
        System.out.println("查询了100个用户数据!");
        try {
            Thread.sleep(2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        long endTimer = System.currentTimeMillis();
        System.out.println("selectUsers"+"方法耗时:" + (endTimer - startTimer) / 1000.0 + "s");
    }
 
    @Override
    public boolean deleteUsers() {
        long startTimer = System .currentTimeMillis();
        try {
            System.out.println("删除100个用户数据!");
            Thread.sleep(500);
            long endTimer = System.currentTimeMillis();
            System.out.println("deleteUsers"+"方法耗时:" + (endTimer - startTimer) / 1000.0 + "s");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
 
    }
 
    @Override
    public void updateUsers() {
        long startTimer = System .currentTimeMillis();
        try {
            System.out.println("修改100个用户数据!");
            Thread.sleep(2500);
        } catch (Exception e) {
            e.printStackTrace();
        }
        long endTimer = System.currentTimeMillis();
        System.out.println("updateUsers"+"方法耗时:" + (endTimer - startTimer) / 1000.0 + "s");
    }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.itheima.proxy;
 
 
public class Test {
    public static void main(String[] args) {
        // 1、把业务对象,直接做成一个代理对象返回,代理对象的类型也是 UserService类型
        UserService userService=new UserServiceImpl();
        System.out.println(userService.login("admin", "1234"));
        System.out.println(userService.deleteUsers());
        userService.selectUsers();
        userService.updateUsers(); // 走代理
    }
}

 

login方法耗时:1.005s
success
删除100个用户数据!
deleteUsers方法耗时:0.505s
true
查询了100个用户数据!
selectUsers方法耗时:2.002s
修改100个用户数据!
updateUsers方法耗时:2.502s

 

其中的

long startTimer = System .currentTimeMillis();
long endTimer = System.currentTimeMillis();
System.out.println("login"+"方法耗时:" + (endTimer - startTimer) / 1000.0 + "s");

每个方法都会重复调用

这可以用动态代理去实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.itheima.d9_proxy;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
    public static Object newProxyInstance(ClassLoader loader,  Class<?>[] interfaces, InvocationHandler h)
    参数一:类加载器,负责加载代理类到内存中使用。
    参数二:获取被代理对象实现的全部接口。代理要为全部接口的全部方法进行代理
    参数三:代理的核心处理逻辑
 */
public class ProxyUtil {
    /**
      生成业务对象的代理对象。
     * @param obj
     * @return
     */
    public static <T> T  getProxy(T obj) {
        // 返回了一个代理对象了
        return (T)Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 参数一:代理对象本身。一般不管
                        // 参数二:正在被代理的方法
                        // 参数三:被代理方法,应该传入的参数
                       long startTimer = System .currentTimeMillis();
                        // 马上触发方法的真正执行。(触发真正的业务功能)
                        Object result = method.invoke(obj, args);
 
                        long endTimer = System.currentTimeMillis();
                        System.out.println(method.getName() + "方法耗时:" + (endTimer - startTimer) / 1000.0 + "s");
 
                        // 把业务功能方法执行的结果返回给调用者
                        return result;
                    }
                });
    }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
package com.itheima.d9_proxy;
 
public class Test {
    public static void main(String[] args) {
        // 1、把业务对象,直接做成一个代理对象返回,代理对象的类型也是 UserService类型
        UserService userService = ProxyUtil.getProxy(new UserServiceImpl());
        System.out.println(userService.login("admin", "1234"));
        System.out.println(userService.deleteUsers());
        userService.selectUsers();
        userService.updateUsers(); // 走代理
    }
}

  

posted @   __破  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示