用Spring大概有3个月,一直都是张口AOP,闭口AOP,但是Spring的AOP具体是怎么实现的,现在也不是十分清楚.
只知道可以用JDK的动态代理,基于接口,或者是cglib方式字节码增强.目前对JDK的动态代理方式不是很理解,固拿出来探讨下,我知道这应该是个新手贴,但还是请大家给点意见.如果真正理解了动态代理,那么对基于Spring AOP出现的各种现象就比较容易理解了.
先贴上一段代码.
[code]package com.jamesby.proxy;
public interface CarCompany {
public void makeCar();
public void abc();
}
package com.jamesby.proxy;
public class CarCompanyImpl implements CarCompany {
public void makeCar() {
System.out.println("Company A make a car!");
abc();
}
public void abc()
{
System.out.println("abc is invoked!");
}
}
package com.jamesby.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class CarCompanyHandler implements InvocationHandler {
CarCompany com;
public CarCompanyHandler(CarCompany com) {
this.com = com;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("time1:" + System.currentTimeMillis());
method.invoke(this.com, new Class[] {});
System.out.println("time2:" + System.currentTimeMillis());
return null;
}
}
package com.jamesby.proxy;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] arg) {
CarCompanyImpl a = new CarCompanyImpl();
CarCompanyHandler handler = new CarCompanyHandler(a);
// 产生一个新的代理类
CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);
com.makeCar();
}
}[/code]
从以上代码可以看出在调用com.makeCar()的时候动态代理会生效,而在makeCar()方法中调用abc()的时候并不会进行动态代理.
猜测到底JDK是如何实现动态代理的?
1.基于JDK的反射机制,通过JDK调用handler的method.invoke(this.com, new Class[] {});实现对最终方法的调用,前后各有代码也有点Decorator的味道!
2.也是我比较模糊的一点
[code] CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);
com.makeCar();[/code]
也就是动态代理JDK到底是如何实现的?
JDK的动态代理并没有生成具体的类,她只是在运行中起动态调用目标类的作用,那么代码
[code]CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);[/code]
究竟做了什么,是将CarCompany注册到JDK的某个地方,当调用com.makeCar()的时候JDK到注册的地方去寻找,发现有注册就进行动态代理?
只知道可以用JDK的动态代理,基于接口,或者是cglib方式字节码增强.目前对JDK的动态代理方式不是很理解,固拿出来探讨下,我知道这应该是个新手贴,但还是请大家给点意见.如果真正理解了动态代理,那么对基于Spring AOP出现的各种现象就比较容易理解了.
先贴上一段代码.
[code]package com.jamesby.proxy;
public interface CarCompany {
public void makeCar();
public void abc();
}
package com.jamesby.proxy;
public class CarCompanyImpl implements CarCompany {
public void makeCar() {
System.out.println("Company A make a car!");
abc();
}
public void abc()
{
System.out.println("abc is invoked!");
}
}
package com.jamesby.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class CarCompanyHandler implements InvocationHandler {
CarCompany com;
public CarCompanyHandler(CarCompany com) {
this.com = com;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("time1:" + System.currentTimeMillis());
method.invoke(this.com, new Class[] {});
System.out.println("time2:" + System.currentTimeMillis());
return null;
}
}
package com.jamesby.proxy;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] arg) {
CarCompanyImpl a = new CarCompanyImpl();
CarCompanyHandler handler = new CarCompanyHandler(a);
// 产生一个新的代理类
CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);
com.makeCar();
}
}[/code]
从以上代码可以看出在调用com.makeCar()的时候动态代理会生效,而在makeCar()方法中调用abc()的时候并不会进行动态代理.
猜测到底JDK是如何实现动态代理的?
1.基于JDK的反射机制,通过JDK调用handler的method.invoke(this.com, new Class[] {});实现对最终方法的调用,前后各有代码也有点Decorator的味道!
2.也是我比较模糊的一点
[code] CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);
com.makeCar();[/code]
也就是动态代理JDK到底是如何实现的?
JDK的动态代理并没有生成具体的类,她只是在运行中起动态调用目标类的作用,那么代码
[code]CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);[/code]
究竟做了什么,是将CarCompany注册到JDK的某个地方,当调用com.makeCar()的时候JDK到注册的地方去寻找,发现有注册就进行动态代理?