您的位置:首页 > 编程语言 > Java开发

spring原理探讨-经典AOP

2014-12-05 20:24 281 查看
Aop是面向切面的编程,我的理解就是给他套包装,一层套一层。

首先来看看如何返回一个对象的代理。

package agint;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 打印日志
* @author Administrator
*
*/
public class ShowLogHanlder implements InvocationHandler{
/**
* 目标对象
*/
private Object target;
/**
* 代理初始化
* @param target
* @return
*/
public static Object initNextAngient( Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new ShowLogHanlder(target));
}

public ShowLogHanlder(Object target) {
super();
this.target = target;
}
/**
* 自己的代理逻辑实现
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("计算开始");
Object obj=method.invoke(target, args);
System.out.println("计算结束");
return obj;
}

}
这个类的目的是调用其中静态的initNextAngient返回目标对象的代理。
如何实现多个代理对象的嵌套呢

package agint;

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

public class ChackValueHanlder implements InvocationHandler{

private Object target;

public static Object initNextAngient( Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new ChackValueHanlder(target));
}

public ChackValueHanlder(Object target){
this.target=target;
}

public void CheakValue(Object obj){
double value=(Double) obj;
if(value<0){
System.out.println("数据必须大于0");
}else{
System.out.println("数据合法");
}
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
for(Object obj:args){
CheakValue(obj);
}
try {
return method.invoke(target, args);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

}


上边的两个均是代理对象。嵌套代理只需下面代码实现即可
ShowLogHanlder.initNextAngient(ChackValueHanlder.initNextAngient(calucateImpl))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: