摘錄地址:
http://jamesby.javaeye.com/blog/71036
用Spring大概有3個月,一直都是張口AOP,閉口AOP,但是Spring的AOP具體是怎么實現的,現在也不是十分清楚.
只知道可以用JDK的動態代理,基于接口,或者是cglib方式字節碼增強.目前對JDK的動態代理方式不是很理解,固拿出來探討下,我知道這應該是個新手貼,但還是請大家給點意見.如果真正理解了動態代理,那么對基于Spring AOP出現的各種現象就比較容易理解了.
先貼上一段代碼.
代碼
- 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;
- //構造時將被代理類綁定到Handler
- public CarCompanyHandler(CarCompany com) {
- this.com = com;
- }
-
- /**相當于要把代理類的執行方法重新包裝
- *proxy:被代理類
- *method:被代理類要執行的方法
- *args:被代理類要執行的方法時需要的參數
- **/
- 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();
- //將被代理類綁定到handler
- CarCompanyHandler handler = new CarCompanyHandler(a);
-
- CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
- .getClassLoader(), new Class[] { CarCompany.class }, handler);
- com.makeCar();
- }
- }