案例准备,提出问题

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

200

被折叠的 条评论
为什么被折叠?



