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方法执行,写入日志======"); } }
代理类:
如果是静态代理:
public class LogProxy implements Log{ //被代理的对象 private LogImpl proxyObj; @override public Logging(){ dobefor(); this.proxyObj.Log(); dofafter(); } }
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());//被代理类的接口=(<span style="font-family: Arial, Helvetica, sans-serif;">被代理类的接口</span>)工厂.bind(new 被代理类); login.logging();// } }
运行结果:
方法logging執行前 =====logging方法执行,写入日志====== 方法logging執行后