Spring 的精华就是IOC AOP,主要通过反射实现。
当需要为多个不具有继承层次的对象引入同一个公共行为的时候,例如记录日志,安全检查等等。如果考虑用OOP的思想进行设计,需要为每一个对象实现相同功能的记录日志或者安全检查的方法,这样,虽然能解决问题,但是其代价就是在程序中存在大量的重复性代码。
那么,如何才能更好的解决此问题呢?此时需要用到AOP(面向切面编程)的思想。而利用java中的动态代理机制就能很容易的实现AOP
接口:
public interface Log {
public void logging();
}
目标类:
public class LogImpl implements Log {
@Override
public void logging() {
System.out.println("=====logging方法执行,写入日志======");
}
}
代理类:
package com.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogProxy implements InvocationHandler {
private Object proxyObj;
public LogProxy(Object obj) {
this.proxyObj = obj;
}
@SuppressWarnings("unchecked")
public static Object bind(Object obj) {
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(), new LogProxy(obj));
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
dobefore(method);
Object object = method.invoke(proxyObj, args);
doafter(method);
return object;
}
private void dobefore(Method method) {
prt("方法" + method.getName() + "執行前");
}
private void doafter(Method method) {
prt("方法" + method.getName() + "執行后");
}
public void prt(String msg) {
System.out.println(msg);
}
}
客户端调用:
public class Testlog {
public static void main(String[] args) {
// TODO Auto-generated method stub
Log login = (Log)LogProxy.bind(new LogImpl());
login.logging();
}
}
运行结果:
方法logging執行前
=====logging方法执行,写入日志======
方法logging執行后