public String getMemberInfo() {
System.out.println(“获取用户信息”);
return “用户信息”;
}
}
public class MemberServiceProxy implements MemberService {
private MemberService target;
public MemberServiceProxy(MemberService target) {
this.target = target;
}
@Override
public String login(String username, Stringpassword) {
long start =System.currentTimeMillis();
String result = target.login(username,password);
long end = System.currentTimeMillis();
System.out.println(“登录耗时:” + (end -start) + “ms”);
return result;
}
@Override
public void logout() {
target.logout();
}
@Override
public String getMemberInfo() {
return target.getMemberInfo();
}
}
public class Test {
public static void main(String[] args) {
MemberServiceProxy proxy = new MemberServiceProxy(new MemberServiceImpl());
proxy.login(“123456”, “123456”);
}
}
这种静态代理的方式可以让你在不修改原始服务类的情况下,添加一些额外的功能,这样看起来还是比较好用的,但是呢,这种方式还是有一定的缺点,假如说你想给服务里其他接口也添加这个统计耗时的功能,你想给其他服务的接口也添加这个功能,那是不是
- 就需要增加类的数量:每个需要代理的类都需要一个对应的代理类。当你有成百上千个服务的时候,代码就会变得非常复杂,维护这成百上千个代理类也会变得困难。
- 这种方式也不够灵活:因为静态代理模式是编译时确定的,那就意味着在编译的时候就需要知道代理的具体类型。如果需要在运行时决定使用哪个代理,静态代理就很难做到了。
- 这样做维护成本是非常高的:如果我原始类的接口发生变化,代理类也需要相应地更改。这就会导致大量的代理类需要维护。所以,我们可以考虑一个更好的方式来做,就是动态代理。
动态代理
动态代理,实现方式有两种:基于 JDK 的动态代理和基于CGLIB 的动态代理。
静态代理的那个代理类是我们要自己写的,如果有一万个serviceÿ