UserService的例子
有一个UserServiceImpl类实现了UserService接口的add和delete方法:
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("add");
}
public void delete() {
System.out.println("delete");
}
}
public interface UserService {
void add();
void delete();
}
现在有一个需求:在不改变UserServiceImpl类的前提下,给add方法和delete方法增加日志功能。采用代理类进行实现:
public class UserServiceImplProxy implements UserService{
private UserServiceImpl userServiceImpl;
public void setUserService(UserServiceImpl userServiceImpl) {
this.userServiceImpl = userServiceImpl;
}
public void log(String str){
System.out.println("log:"+str);
}
public void add() {
log("add");
userServiceImpl.add();
}
public void delete() {
log("delete");
userServiceImpl.delete();
}
}
这时候客户端使用代理类的add和delete方法就可以了,跟前一个例子不一样的地方是这里采用set方法注入,而不是构造器注入:
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
UserServiceImplProxy userServiceImplProxy = new UserServiceImplProxy();
userServiceImplProxy.setUserService(userService);
userServiceImplProxy.add();
userServiceImplProxy.delete();
}
}
分析
- 跟租房的例子其实是一样的,区别在于依赖注入的方式不同,一个是构造器注入,一个是set方法注入。
- 静态代理实现了什么功能呢?总结下来就是在不改动一个类的情况下对它的功能进行拓展。
- 每次都得写个代理类是不是很麻烦?