- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
简介
- 代理是常见的设计模式,简单的说他就是控制对一个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理 。 spring中的aop特性就是通过代理类实现的。
特点
- 代理类对于我们使用这来说是无感知的。因为他和委托类继承同一个接口,所以我们在调用的时候方法都是一样的。只不过在代理类内部会在转发到委托类之前和之后进行相应的处理。代理分为静态代理和动态代理。而动态代理我们常见的有jdk动态代理、cglib动态代理。
静态代理
-
所谓的静态代理就是说在编译前就产生代理类。实际上就是我们手动提供一个实现类。实现类中转发到真实对象中。下面我们简单实现下静态代理
-
接口类
public interface UserInterface {
/**
* 获取用户名
* @return
*/
public String getUserName();
/**
* 注册用户
* @param user
*/
public void registerUser(Object user);
}
- 真实实现类
public class UserInterfaceImpl implements UserInterface {
@Override
public String getUserName() {
return "zxhtom";
}
@Override
public void registerUser(Object user) {
System.out.println("注册成功");
}
}
- 代理实现类
public class UserInterfaceProxy implements UserInterface {
private UserInterface userInterface;
public UserInterfaceProxy(UserInterface userInterface) {
this.userInterface = userInterface;
}
@Override
public String getUserName() {
String userName = userInterface.getUserName();
System.out.println("我拦截到用户姓名:"+userName);
return userName;
}
@Override
public void registerUser(Object user) {
System.out.println("我不想让你注册。滚回去");
}
}
-
逻辑分析: 我们实现逻辑很简单。真实实现类有两个方法一个获取用户名,一个注册用户。因为这里是为了模拟所以直接输出注册用户的日志了。我们的代理实现类构造需要一个真实的实现类。方便代理他所以需要传一个真实的实现类。然后在转发到真实方法前或者后我们自定义了一些自己的行为。getUserName中我们打印了一句获取用户名的日志。registerUser直接拦截了。不进行转发。
-
Test类
public static void main(String[] args) {
UserInterface userInterface = new UserInterfaceProxy(new UserInterfaceImpl());
userInterface.getUserName();
userInterface.registerUser(null);
}
- 日志
- 小结 上面的就是静态代理。我们不难发现静态代理有个很大的问题就是代理类很多。而且代理类构造器需要真实类。总结一句话就是代码量很多。代理类必须实现接口的方法。