spring 03.動態代理
阿新 • • 發佈:2018-11-24
概述:
動態代理是指動態的在記憶體中構建代理物件(需要我們制定要代理的目標物件實現的介面型別),即利用JDK的API生成指定介面的物件,也稱之為JDK代理或者介面代理。
動態代理的總結
優點:代理物件無需實現介面,免去了編寫很多代理類的煩惱,同時介面增加方法也無需再維護目標物件和代理物件,只需在事件處理器中新增對方法的判斷即可。
缺點:代理物件不需要實現介面,但是目標物件一定要實現介面,否則無法使用JDK動態代理。
實現方式:
第一步:增加maven依賴
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.spring03</groupId>
<artifactId>spring03_dynamic_proxy</artifactId>
<version >0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
</dependencies>
</project>
第二步:編寫Rent介面
package org.spring03;
/**
* 房屋出租介面
*/
public interface Rent {
void rent();
}
第三步:編寫Host
Host.java
package org.spring03;
/**
* 房東類
*/
public class Host implements Rent{
public void rent() {
System.out.println("房主出租房屋!");
}
}
第四步 編寫動態代理類
MyInovationHandler.java
package org.spring03;
import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 動態代理類 動態的在記憶體中生成代理類物件
*/
public class MyInovationHandler implements InvocationHandler {
private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
/**
* 生成代理類 引數一:類載入器、物件即用哪個類載入器來載入這個代理類到 JVM 的方法區(當前的代理器類)
* 引數二:介面表明該代理類需要實現的介面(房東類) 引數三:是呼叫處理器類例項即 ProxyInovationHandler 的實現的例項物件
*/
public Object getProxy() {
return Proxy.newProxyInstance(rent.getClass().getClassLoader(), // 和目標物件的類載入器保持一致
rent.getClass().getInterfaces(), // 目標物件實現的介面,因為需要根據介面動態生成物件
this);// InvocationHandler:事件處理器,即對目標物件方法的
}
/**
* proxy 是代理類 method 代理類的呼叫處理的方法
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("房屋出租開始");
Object result = method.invoke(rent, args);
System.out.println("房屋出租結束");
return result;
}
}
第五步 編寫測試類
Test.java
package org.spring03;
public class Test {
public static void main(String[] args) {
Host host = new Host();
MyInovationHandler pih = new MyInovationHandler();
pih.setRent(host);
Rent rent = (Rent) pih.getProxy();
rent.rent();
}
}
執行結果
房屋出租開始
房主出租房屋!
房屋出租結束