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