通過動態代理模擬Spring AOP – JAVA編程語言程序開發技術文章

1.包名:

com.bestaone.aop

2.包含class文件:

AOPFactory.java   AOP工廠
AopHandler.java   代理類

ClientTest.java   測試類

FunListener.java   模擬權限監聽器

Listener.java   監聽器接口

LogListener.java   模擬日志監聽器
3.具體類容

AOPFactory.java   AOP工廠

[java] 
package com.bestaone.aop; 
 
/**
 * AOP工廠
 * @author 張國聖
 */ 
public class AOPFactory { 
     
    /**
     * 實例化對象
     * @param clzzName
     * @return
     */ 
    private static Object getClassInstance(String clzzName) { 
        Object obj = null; 
        try { 
            Class cls = Class.forName(clzzName); 
            obj = (Object) cls.newInstance(); 
        }catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return obj; 
    } 
 
    /**
     *  創建代理類,並添加監聽器
     * @param clzzName
     * @param listenerName 監聽器
     * @return 代理類
     */ 
    public static Object getAOPProxyedObject(String clzzName, String[] listenerName) { 
        Object proxy = null; 
        Listener[] listeners = null; 
        if(listenerName!=null && listenerName.length>0){ 
            listeners = new Listener[listenerName.length]; 
            for(int i=0;i<listeners.length;i++){ 
                listeners[i] = (Listener)getClassInstance(listenerName[i]); 
            } 
        }     www.aiwalls.com
        AopHandler handler = new AopHandler(); 
        Object obj = getClassInstance(clzzName); 
        proxy = handler.bind(obj,listeners); 
        return proxy; 
    } 
 

AopHandler.java   代理類

[java] 
package com.bestaone.aop; 
 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 
 
/**
 * 代理類
 * @author 張國聖
 */ 
public class AopHandler implements InvocationHandler{ 
 
    private Object proxyObj; 
    private Listener[] listeners; 
     
    public Object bind(Object obj,Listener[] listeners) { 
        this.proxyObj = obj; 
        this.listeners = listeners; 
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); 
    } 
 
    /**
     * 由於線程的關系,打印的順序不是我們想要的,但這不影響這個說明AOP!
     */ 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
        Object result = null; 
        try { 
            if(listeners!=null){ 
                this.before(proxy, method, args); 
            } 
            result = method.invoke(proxyObj, args); 
            if(listeners!=null){ 
                this.after(proxy, method, args); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return result; 
    } 
     
    /**
     * 方法前監聽
     * @param proxy
     * @param method
     * @param args
     */ 
    public void before(Object proxy, Method method, Object[] args){ 
        for(int i=0;i<listeners.length;i++){ 
            listeners[i].before(proxy, method, args); 
        } 
    } 
     
    /**
     * 方法後監聽
     * @param proxy
     * @param method
     * @param args
     */ 
    public void after(Object proxy, Method method, Object[] args){ 
        for(int i=listeners.length-1;i>=0;i–){ 
            listeners[i].after(proxy, method, args); 
        } 
    } 
     

ClientTest.java   測試類

[java]
package com.bestaone.aop; 
 
import com.bestaone.UserService; 
 
/**
 * 使用代理實現AOP攔截
 * @author 張國聖
 */ 
public class ClientTest { 
 
    public static void main(String[] args) { 
        //要除去AOP攔截,隻需設置listenerName=null就可以瞭 
        String[] listenerName = {"com.bestaone.aop.FunListener","com.bestaone.aop.LogListener"}; 
        UserService userService = (UserService) AOPFactory.getAOPProxyedObject("com.bestaone.UserServiceImpl",listenerName); 
        userService.save("張三被保存!註:由於線程的關系,打印的順序不是我們想要的,但這不影響演示AOP"); 
    } 
 

FunListener.java   模擬權限監聽器

[java] 
package com.bestaone.aop; 
 
import java.lang.reflect.Method; 
 
/**
 * 模擬權限監聽器
 * @author 張國聖
 */ 
public class FunListener implements Listener{ 
 
    @Override 
    public void before(Object proxy, Method method, Object[] args){ 
        System.err.println(method.getName() + "方法運行之前檢查權限!"); 
    } 
     
    @Override 
    public void after(Object proxy, Method method, Object[] args){ 
        System.err.println(method.getName() + "方法運行之後檢查權限!"); 
    } 
     

Listener.java   監聽器接口

[java] 
package com.bestaone.aop; 
 
import java.lang.reflect.Method; 
 
/**
 * 監聽器接口
 * @author 張國聖
 */ 
public interface Listener{ 
 
    public void before(Object proxy, Method method, Object[] args); 
     
    public void after(Object proxy, Method method, Object[] args); 
     

LogListener.java   模擬日志監聽器

[java] 
package com.bestaone.aop; 
 
import java.lang.reflect.Method; 
 
/**
 * 模擬日志監聽器
 * @author 張國聖
 */ 
public class LogListener implements Listener{ 
 
    @Override 
    public void before(Object proxy, Method method, Object[] args){ 
        System.err.println(method.getName() + "方法運行之前打印日志!"); 
    } 
     
    @Override 
    public void after(Object proxy, Method method, Object[] args){ 
        System.err.println(method.getName() + "方法運行之後打印日志!"); 
    } 
     

作者:bestaone

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。