1、静态代理的角色分析:
抽象角色:一般使用接口或抽象类来实现 (租)
真实角色:被代理的角色 (房东)
代理角色:代理真实角色--代理真实角色后一般会做一些附属操作 (代理)
客 户:使用代理角色来进行一些操作
Rent.java抽象角色:
package spring.staticproxy;
public interface Rent {
public void rent();
}
Client.java客户角色:
package spring.staticproxy;
public class Client {
public static void main(String[] args) {
Host host=new Host();
Proxy proxy=new Proxy(host);
proxy.rent();
}
}
package spring.staticproxy;
public interface Rent {
public void rent();
}
package spring.staticproxy;
public class Client {
public static void main(String[] args) {
Host host=new Host();
Proxy proxy=new Proxy(host);
proxy.rent();
}
}
Proxy.java代理角色:
package spring.staticproxy;
public class Proxy implements Rent {
private Host host;
public Proxy() {
super();
}
public Proxy(Host host) {
super();
this.host = host;
}
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
// 租房:
public void rent() {
seeHouse();
host.rent();
fare();
}
// 收费
private void fare() {
System.out.println("收取中介费");
}
// 看房
private void seeHouse() {
System.out.println("带房客看房");
}
}
Host.java真实角色:
package spring.staticproxy;
public class Proxy implements Rent {
private Host host;
public Proxy() {
super();
}
public Proxy(Host host) {
super();
this.host = host;
}
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
// 租房:
public void rent() {
seeHouse();
host.rent();
fare();
}
// 收费
private void fare() {
System.out.println("收取中介费");
}
// 看房
private void seeHouse() {
System.out.println("带房客看房");
}
}
package spring.staticproxy;
public class Host implements Rent {
public void rent() {
System.out.println("房屋出租");
}
}
2、使用代理的好处
使真实角色处理的业务更加纯粹,不再去关注一些公众的东西()
公共的业务由代理来完成,实现业务分工
公共业务发生扩展时变得更加集中和方便
缺点:
类多了,多了代理类,工作量变大
3、动态代理
动态代理和静态代理的角色是一样的
动态代理的代理是动态生成的
分两类:一类是基于接口动态代理 JDK动态代理
一类是基于类的动态代理 cglib
现在Javasist来生成动态代理
4、JDK 动态代理 --- Proxy代理,InvocationHander接口
实现动态代理:
接口Rent.java
package spring.dynamicproxy;
public interface Rent {
public void rent();
}
Host.java
package spring.dynamicproxy;
public class Host implements Rent {
public void rent() {
// TODO Auto-generated method stub
System.out.println("房屋出租");
}
}
proxyInvocationHandler.java
package spring.dynamicproxy;
public class Host implements Rent {
public void rent() {
// TODO Auto-generated method stub
System.out.println("房屋出租");
}
}
package spring.dynamicproxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.cglib.proxy.InvocationHandler;
public class ProxyInvocationHandler implements InvocationHandler,
java.lang.reflect.InvocationHandler {
// private Object target;
// 生成setTarget()
private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent
.getClass().getInterfaces(), this);
}
// proxy是代理类method代理类的调用处理程序的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
private void fare() {
System.out.println("收取中介费");
}
// 看房
private void seeHouse() {
System.out.println("带房客看房");
}
}
package spring.dynamicproxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.cglib.proxy.InvocationHandler;
public class ProxyInvocationHandler implements InvocationHandler,
java.lang.reflect.InvocationHandler {
// private Object target;
// 生成setTarget()
private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent
.getClass().getInterfaces(), this);
}
// proxy是代理类method代理类的调用处理程序的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
private void fare() {
System.out.println("收取中介费");
}
// 看房
private void seeHouse() {
System.out.println("带房客看房");
}
}
proxy是代理类,method是代理类调用处理程序的方法对象,
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
proxy是代理类,method是代理类调用处理程序的方法对象,
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent
.getClass().getInterfaces(), this);
}
package spring.dynamicproxy;
public class Client {
public static void main(String[] args) {
Host host = new Host();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setRent(host);
Rent proxy = (Rent) pih.getProxy();
proxy.rent();
}
}