String Aop 動態代理例子


動態代理原理:spring AOP采用動態代理來實現

(1)定義一個接口Boy

 

package aop001;

public interface Boy {
public void beat(String time);

public void play(String time);
}

 

(2)定義兩個類實現Boy接口:

Boy_1

package aop001;

public class Boy_1 implements Boy {

@Override
public void beat(String time) {
System.out.println(
"我是boy1");
System.out.println(time
+"敲代碼");
}

@Override
public void play(String time) {
System.out.println(
"我是boy1");
System.out.println(time
+"玩游戲");
}

}

Boy_2

package aop001;

public class Boy_2 implements Boy{

@Override
public void beat(String time) {
System.out.println(
"我是boy2");
System.out.println(time
+"敲代碼");
}

@Override
public void play(String time) {
System.out.println(
"我是boy2");
System.out.println(time
+"玩游戲");
}

}

(3)定義一個動態代理類並實現InvocationHandler接口

package aop001;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class BoyInvocationHandler implements InvocationHandler {
//定義一個Object對象,保存目標
private Object targer;// 目標是不固定

//添加構造方法,可以通過構造方法給target賦值
public BoyInvocationHandler(Object targer) {
this.targer = targer;
}

//非核心業務的代碼由動態代理來管理
//定義一個前置任務的方法
private void before(){
// 前置任務
System.out.println("[代理執行前置]起床");
System.out.println(
"[代理執行前置]刷牙洗臉");
System.out.println(
"[代理執行前置]吃飯");
System.out.println(
"*****************");
}

//定義一個后置任務的方法
private void after(){
// 后置任務
System.out.println("*****************");
System.out.println(
"[代理執行后置]洗澡");
System.out.println(
"[代理執行后置]睡覺");
System.out.println(
"");
}

//調用invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//調用前置任務的方法
before();
//獲取類里面的方法的返回值
Object returnValue=method.invoke(targer, args);
//調用后置任務的方法
after();

return returnValue;
}




}

(4)新建一個Test測試類

package aop001;

import java.lang.reflect.Proxy;

public class Test {

public static void main(String[] args) {
//第一步:創建目標實現類的實例
Boy b1=new Boy_1();
Boy b2
=new Boy_2();

//第二步:創建一個動態代理類(CEO 首席執行官)
BoyInvocationHandler handler1 = new BoyInvocationHandler(b1);
BoyInvocationHandler handler2
= new BoyInvocationHandler(b2);

//第三步:創建動態代理(跟靜態代理一樣,申明的變量仍然是目標的接口)
Boy girlProxy1 = (Boy) Proxy.newProxyInstance(
b1.getClass().getClassLoader(),
b1.getClass().getInterfaces(),
handler1);
//調用方法
girlProxy1.beat("周六");
girlProxy1.play(
"周日");

Boy girlProxy2
= (Boy) Proxy.newProxyInstance(
b2.getClass().getClassLoader(),
b2.getClass().getInterfaces(),
handler2);
girlProxy2.beat(
"周六");
girlProxy2.play(
"周日");

}

}

(5)運行結果:

[代理執行前置]起床
[代理執行前置]刷牙洗臉
[代理執行前置]吃飯
*****************
我是boy1
周六敲代碼
*****************
[代理執行后置]洗澡
[代理執行后置]睡覺

[代理執行前置]起床
[代理執行前置]刷牙洗臉
[代理執行前置]吃飯
*****************
我是boy1
周日玩游戲
*****************
[代理執行后置]洗澡
[代理執行后置]睡覺

[代理執行前置]起床
[代理執行前置]刷牙洗臉
[代理執行前置]吃飯
*****************
我是boy2
周六敲代碼
*****************
[代理執行后置]洗澡
[代理執行后置]睡覺

[代理執行前置]起床
[代理執行前置]刷牙洗臉
[代理執行前置]吃飯
*****************
我是boy2
周日玩游戲
*****************
[代理執行后置]洗澡
[代理執行后置]睡覺

 

(6)當我們需要更改非核心代碼時,我們只要更改一處就可以了。

 

謝謝!

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com