MyBatis多級代理程式設計實現

ofollow,noindex">Mybatis代理設計模式(Proxy)與程式設計實現原理
下面接著上篇文章寫繼續寫多級代理
1. 例項講解
a. 例項介紹
- 實現一個多級代理,螳螂捕蟬,黃雀在後。
- 蟬吃樹葉,螳螂吃蟬,黃雀吃螳螂。
b. 具體實現
步驟1:建立一個介面物件(BaseService),宣告真實物件(蟬),蟬的行為被監聽,需要被代理物件1(螳螂)吃掉,螳螂的主要任務也是吃,行為被監聽,被代理物件2(黃雀)吃掉。
public interface BaseService { //吃是主要業務,也是被監聽行為 public void eat(); }
步驟2:建立真實物件(蟬)
public class 蟬 implements BaseService { @Override public void eat() { System.out.println("蟬吃樹葉"); } }
步驟3:建立代理物件1(螳螂) 也是被行為監聽物件。
public class 螳螂 implements InvocationHandler { private BaseService obj;//小蟬真實物件 //invoke方法就是螳螂類的主要業務方法,也是需要被監聽方法 @Override public Object invoke(Object listener, Method method, Object[] args) throws Throwable { //蟬吃樹葉 method.invoke(obj, args); 次要業務(); return null; } //完成主要業務和次要業務繫結 public 螳螂(BaseService param) { this.obj = param; } private void 次要業務(){ System.out.println("螳螂吃蟬"); } }
步驟4:建立代理工廠(BeanFactory),對所有吃的行為有一個監聽。
public class BeanFactory { public static BaseService newInstance(Class classFile){ //1.建立一個真實的小蟬 BaseService真實小蟬 =new 蟬(); //2.建立代理實現類物件螳螂 InvocationHandler 螳螂 = new 螳螂(真實小蟬); //3.向JVM所要代理物件(監聽物件) 監聽蟬何時吃樹葉,通知螳螂 Class array[]={BaseService.class}; BaseService proxy1=(BaseService) Proxy.newProxyInstance(classFile.getClassLoader(), array, 螳螂); } }
步驟5:上面幾個步驟基本上一級代理已經實現,下面主要思考螳螂的主要業務是什麼?
public class 黃雀 implements InvocationHandler { private Object proxy1;//監聽小嬋的監聽物件 public 黃雀(Object proxy1) { this.proxy1 = proxy1; } //method就是螳螂的主要方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //主要業務 螳螂軍吃蟬,讓一級代理物件通知螳螂,蟬吃樹葉 method.invoke(proxy1, args); 次要業務(); return null; } privatevoid 次要業務(){ System.out.println("黃雀吃螳螂"); } }
步驟6:在BeanFactory中的newInstance方法新增代理實現類(黃雀)
public class BeanFactory { .........................省略前面程式碼 //4.建立代理實現類黃雀 InvocationHandler 黃雀 = new 黃雀(proxy1); BaseService proxy2 =(BaseService) Proxy.newProxyInstance(classFile.getClassLoader(), array, 黃雀); return proxy2; } }
步驟7:新增測試類
public class TestMain { public static void main(String[] args) { BaseService 小蟬 = BeanFactory.newInstance(蟬.class); 小蟬.eat(); } }
測試結果
蟬吃樹葉 螳螂吃蟬 黃雀吃螳螂