Spring的代理模式
什么是代理模式呢,其实简单来说就是通过第三方代理来为我们工作。
比如:中介,房东需要将自己的房子租出去,而租客需要租房子,三者关系如此
租客租房子一般都找不到房东,房东也不会轻易将自己暴露给广大租客,因此就需要中介来充当这个中间关系
因此租客就只能通过中介来进行租房子这个工作,不需要通过房东,这就叫做代理----就是中介代理房东来处理租房子这件事情。
那么接下来让我们java来实现一下吧
提示:以下是本篇文章正文内容,下面案例可供参考
一、静态代理
首先新建一个接口
//抽象的 房子
public interface Rent {
public void rent();
}
新建类并实现接口
//房东
public class Host implements Rent {
@Override
public void rent() {
System.out.println("房东出租。。。。。。。。");
}
}
新建代理类并去实现接口,并对房东类进行包装
//代理
public class Proxy implements Rent{
private Host host;
public Proxy() {
}
public Proxy(Host host) {
this.host = host;
}
@Override
public void rent() {
seeHouse();
host.rent();
hetong();
fare();
}
//中介带领看房子
public void seeHouse(){
System.out.println("中介带领看房子。。。。");
}
//中介带领签合同
public void hetong(){
System.out.println("中介带领签合同。。。");
}
//收中介费
public void fare(){
System.out.println("收中介费。。。。");
}
}
最后我们来测试一下
//客户 要找代理
public class Client {
@Test
public void test(){
//房东出租房子
Host host=new Host();
//代理,中介帮房东租房子
Proxy proxy = new Proxy(host);
//你们不需要面对房东,直接找中介
proxy.rent();
}
}
接下来学习完静态代理去实现租房的过程,接下来我们使用另一种代理模式来实现租房过程,让我们往下看
二、动态代理
首先我们还是新建接口,这里涉及因为我们可能不只是一个去租房,所以我们在新建一个接口去实现租多个房子
//抽象的 房子
public interface Rent {
public void rent();
}
//房子2
public interface Rent2 {
public void rent2();
}
新建类然后去实现接口
//房东
public class Host implements Rent,Rent2 {
@Override
public void rent() {
System.out.println("房东出租。。。。。。。。");
}
@Override
public void rent2() {
System.out.println("房东出租2。。。。。。。。");
}
}
接下来我们要新建一个类去并去实现 InvocationHandler 接口
//动态代理角色
public class ProxyInvocationHandler implements InvocationHandler {
private Object target; //多个代理
public void setTarget(Object target) {
this.target = target;
}
//生成一个代理类
//getInterfaces()获取所有实现的接口
//getClassLoader()类加载器
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//proxy 代理类
// method代理类的调用处理方法的对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//核心,本质还是反射实现的
log(method.getName());
Object result = method.invoke(target, args);
return result;
}
public void log(String msg){
System.out.println("执行了"+msg+"方法");
}
}
用户测试
//客户 找代理
public class Client {
@Test
public void test(){
Host host=new Host();
ProxyInvocationHandler p=new ProxyInvocationHandler();
p.setTarget(host); //将真实角色放进去
Rent proxy = (Rent) p.getProxy(); //动态生成代理类
proxy.rent();
Rent2 proxy1 = (Rent2) p.getProxy(); //动态生成代理类
proxy1.rent2();
}
}
今天就总结到这里啦 ,感谢各位的观看~