动态代理

案例准备,提出问题

 

package com.itxue.d8_proxy;
/*
模拟用户业务功能
 */
public interface UserService {
    String login(String loginName,String passWard);
    void selectUsers();
    boolean deleteUsers();

}
package com.itxue.d8_proxy;

public class UserServiceImpl implements UserService{
    @Override
    public String login(String loginName, String passWard) {
        long startTime = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
            if ("admin".equals(loginName) && "1234".equals(passWard)) {
                return "success";
            }
            return "登录名或者密码有问题!";
        } catch (InterruptedException e) {
            e.printStackTrace();
            return "error";
        } finally {
            long endTime = System.currentTimeMillis();
            System.out.println("login方法耗时:" + (endTime - startTime) / 1000.0 + "秒");
        }
    }

    @Override
    public void selectUsers() {
        long startTime = System.currentTimeMillis();
        System.out.println("查询了100个用户");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println(" selectUsers总共耗时"+(endTime-startTime)/1000.0+"秒");

    }

    @Override
    public boolean deleteUsers() {
        long startTime = System.currentTimeMillis();
        try {
            System.out.println("删除了100个用户");
            Thread.sleep(500);
            return true;
        } catch (InterruptedException e) {
            e.printStackTrace();
            return false;
        }finally {
            long endTime = System.currentTimeMillis();
            System.out.println("deleteUsers总共耗时"+(endTime-startTime)/1000.0+"秒");

        }


    }
}
package com.itxue.d8_proxy;

public class Test {
    public static void main(String[] args) {
        UserService us = new UserServiceImpl();
        System.out.println(us.login("admin", "1234"));

        System.out.println(us.deleteUsers());
        us.selectUsers();
    }
}

 

使用动态代理解决问题

 代理就是被代理者没有能力或者不愿意去做某件事情,需要找个人代替自己完成这件事,动态代理业务功能(方法)进行代理的

关键步骤

package com.itxue.d8_proxy;

public class UserServiceImpl implements UserService{
    @Override
    public String login(String loginName, String passWard) {

        try {
            Thread.sleep(1000);
            if ("admin".equals(loginName) && "1234".equals(passWard)) {
                return "success";
            }
            return "登录名或者密码有问题!";
        } catch (InterruptedException e) {
            e.printStackTrace();
            return "error";
        }
    }

    @Override
    public void selectUsers() {

        System.out.println("查询了100个用户");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    @Override
    public boolean deleteUsers() {

        try {
            System.out.println("删除了100个用户");
            Thread.sleep(500);
            return true;
        } catch (InterruptedException e) {
            e.printStackTrace();
            return false;
        }


    }
}
package com.itxue.d8_proxy;

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

public class ProxyUtil {

    public static UserService getProxy(UserServiceImpl obj) {
//        返回一个代理对象
        return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new
                InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                         参数一:代理对象本身。一般不管
//                        参数二:正在被代理的方法,
//                        参数三:被代理方法,应该传入的参数
                        long startTime = System.currentTimeMillis();
//                        马上触发方法的真正执行(触发真正的业务功能)
                        Object result = method.invoke(obj,args);
//                        把业务功能方法执行的结果返回给调用者
                        long endTime = System.currentTimeMillis();
                        System.out.println(method+"方法耗时:" + (endTime - startTime) / 1000.0 + "秒");
                        return result;
                    }
                });
    }
}
package com.itxue.d8_proxy;

public class Test {
    public static void main(String[] args) {
        UserService us = ProxyUtil.getProxy(new UserServiceImpl());
        System.out.println(us.login("admin", "1234"));

        System.out.println(us.deleteUsers());
        us.selectUsers();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值