Spring中AOP(面向切面编程)实现了将非业务逻辑的代码与业务逻辑的代码分离的功能.Spring AOP的底层实现是JDK的动态代理或者CGLib的动态代理.Spring在3.0之前使用的是JDK动态代理,而在3.0及以后使用的是CGLib动态代理.
静态代理与动态代理
关于静态代理就是在已经写好源代码,经过编译,在运行期之前就已经有了代理对象的class文件.而动态代理是在运行期间通过反射生成的对象.代理有两种实现:一种是根据被代理类的接口,生成子类继承接口.第二种是生成子类继承被代理类.
JDK动态代理与CGlib动态代理
Jdk动态代理是前者,被代理类必须要有接口,比较麻烦,而CGLib是生成继承被代理类的子类的字节码,然后加载这个字节码.具体的内容还没有深入到CGLib的JAR包中去看.
JDK动态代理的使用
public interface Father { public String eat(String food); }
public class Cat implements Father{ private String name ; private int age; public Cat() { super(); } public Cat(String name, int age) { super(); this.name = name; this.age = age; } public String eat(String food){ System.out.println("I am eating " + food); return "I am eating " + food; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start : " + new Date());
Object obj = method.invoke(target, args);
System.out.println("end : " + new Date());
return obj;
}
}
Cat cat = new Cat("Tom", 2);
ProxyHandler proxyHandler = new ProxyHandler(cat);
Father catProxy = (Father) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), proxyHandler);
catProxy.eat("fish...");