先看代码,认识以下什么是静态代理
实例
目标类的接口
/**
* UserService 是 目标类的接口
* login() 就是要被代理的方法
*/
public interface UserService {
boolean login(String userName, String password);
}
目标类
注意,要代理的方法,必须从接口中实现
/**
* UserServiceImpl 是目标类,或者叫被代理的类
* login() 就是要被代理的方法
*/
public class UserServiceImpl implements UserService {
@Override
public boolean login(String userName, String password) {
System.out.println("校验账号");
return false;
}
}
代理类
注意,要代理的方法,必须从接口中实现
/**
* UserServiceProxy 是代理类,它继承了 UserService 接口,实现了login()方法
*/
public class UserServiceProxy implements UserService {
/**
* 其实就是写一个新方法把 目标方法包起来
*/
@Override
public boolean login(String userName, String password) {
before();
UserService userServiceImpl = new UserServiceImpl();
Object result = userServiceImpl.login(userName, password);
after();
return result;
}
private void before() {
System.out.println("调用目标方法之前输出的log");
}
private void after() {
System.out.println("调用目标方法之后输出的log");
}
}
测试类
上面三个类构成了jdk动态代理的最小组成单位,接下来,编写测试类使用jdk动态代理
public static void main(String[] args) {
// 创建代理对象
UserService userServiceProxy = new UserServiceProxy();
// 调用代理方法
userServiceProxy.login("wqlm", "123");
}
总结
静态代理设计到三个类
- 目标类的接口 Interface
- 目标类 target
- 代理类 Proxy
代理类通过实现目标类的接口,使之与目标类 类型一致。然后在代理方法中调用目标方法,并在调用前后做一些操作。
优点
- 在不更改目标方法的基础上,对目标方法做增强,降低了系统的耦合度。
- 代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用
缺点
- 目标类需要实现接口,目标方法需要在接口中存在