摘錄地址:
http://jamesby.javaeye.com/blog/71036
用Spring大概有3個(gè)月,一直都是張口AOP,閉口AOP,但是Spring的AOP具體是怎么實(shí)現(xiàn)的,現(xiàn)在也不是十分清楚.
只知道可以用JDK的動(dòng)態(tài)代理,基于接口,或者是cglib方式字節(jié)碼增強(qiáng).目前對(duì)JDK的動(dòng)態(tài)代理方式不是很理解,固拿出來(lái)探討下,我知道這應(yīng)該是個(gè)新手貼,但還是請(qǐng)大家給點(diǎn)意見.如果真正理解了動(dòng)態(tài)代理,那么對(duì)基于Spring AOP出現(xiàn)的各種現(xiàn)象就比較容易理解了.
先貼上一段代碼.
代碼
- 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;
- //構(gòu)造時(shí)將被代理類綁定到Handler
- public CarCompanyHandler(CarCompany com) {
- this.com = com;
- }
-
- /**相當(dāng)于要把代理類的執(zhí)行方法重新包裝
- *proxy:被代理類
- *method:被代理類要執(zhí)行的方法
- *args:被代理類要執(zhí)行的方法時(shí)需要的參數(shù)
- **/
- 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();
- }
- }