aop是面向切面编程,是对OO面向对象思想的补充。
下面的例子的利用动态代理实现简单的AOP不用引入任何jar包,spring的AOP的实现原理就是动态代理。
相关java类:
1、业务处理接口
package sinosoft.dj.aop.proxyaop;
public interface IHello {
/**
* 业务处理A方法
* @param name
*/
void sayHello(String name);
/**
* 业务处理B方法
* @param name
*/
void sayGoogBye(String name);
}
2、业务处理实现类
package sinosoft.dj.aop.proxyaop;
public class Hello implements IHello{
public void sayHello(String name) {
System.out.println("Hello " + name);
}
public void sayGoogBye(String name) {
System.out.println(name+" GoodBye!");
}
}
3、日志类
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
/*
*日志类
* */
public class LoggerOperation {
public void start(Method method) {
System.out.println("日志开始Method start。。。。。");
}
public void end(Method method) {
System.out.println(" 日志结束Method end.....");
}
}
4、代理类
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynaProxyHello implements InvocationHandler {
/**
* 操作者
*/
private Object proxy;
/**
* 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
*/
private Object delegate;
/**
* 动态生成方法被处理过后的对象 (写法固定)
*
* @param delegate
* @param proxy
* @return
*/
public Object bind(Object delegate,Object proxy) {
this.proxy = proxy;
this.delegate = delegate;
return Proxy.newProxyInstance(this.delegate.getClass().getClassLoader(), this.delegate.getClass().getInterfaces(), this);
}
/**
* 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
* 此方法是动态的,不是手动调用的
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
//反射得到操作者的实例
Class clazz = this.proxy.getClass();
//反射得到操作者的Start方法
Method start = clazz.getDeclaredMethod("start",
new Class[] { Method.class });
//反射执行start方法
start.invoke(this.proxy, new Object[] { method });
//执行要处理对象的原本方法
result = method.invoke(this.delegate, args);
// 反射得到操作者的end方法
Method end = clazz.getDeclaredMethod("end",
new Class[] { Method.class });
// 反射执行end方法
end.invoke(this.proxy, new Object[] { method });
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
5、测试类
package test;
import sinosoft.dj.aop.proxyaop.DynaProxyHello;
import sinosoft.dj.aop.proxyaop.Hello;
import sinosoft.dj.aop.proxyaop.IHello;
import sinosoft.dj.aop.proxyaop.LoggerOperation;
/*
* java动态代理例子 在各对象执行方法前后执行切入的日志
* */
public class TestDynproxy {
public static void main(String[] args) {
IHello hello = (IHello)new DynaProxyHello().bind(new Hello(),new LoggerOperation());
hello.sayGoogBye("Double J");
// hello.sayHello("Double J");
}
}