Kela's Blog

                      前面的路很坎坷,但畢竟是條路.也許走過(guò)這一段就會(huì)發(fā)現(xiàn),走過(guò)去就是夢(mèng)想中的地方.因此堅(jiān)持成為此刻唯一能做且必須去做的事情.
          posts - 9, comments - 27, trackbacks - 0, articles - 15

          摘要:Spring AOP ,從代理機(jī)制看AOP,動(dòng)態(tài)代理的范例

          ?

          JDK1.3之后加入了可協(xié)助開(kāi)發(fā)動(dòng)態(tài)代理功能的API,你不必為特定對(duì)象與方法編寫特定的代理對(duì)象,使用動(dòng)態(tài)代理,可以使用一個(gè)處理者(Handler)服務(wù)于各個(gè)對(duì)象。

          ?

          ???? LogHandler.java

          ?

          package com.kela.spring.aop;

          ?

          import java.lang.reflect.InvocationHandler;

          import java.lang.reflect.Method;

          import java.lang.reflect.Proxy;

          ?

          import org.apache.log4j.Logger;

          ?

          public class LogHandler implements InvocationHandler {

          ?

          ??? private Logger log = Logger.getLogger(this.getClass().getName());

          ???

          ??? private Object delegate;

          ???

          ??? public Object bind(Object delegate) {

          ??????? this.delegate = delegate;

          ??????? return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);

          ??? }

          ??? public Object invoke(Object arg0, Method method, Object[] args)

          ??????????? throws Throwable {

          ??????? Object result = null;

          ???????

          ??????? try {

          ??????????? log.info("hello 方法開(kāi)始執(zhí)行... ...");

          ???????????

          ??????????? result = method.invoke(delegate, args);

          ???????????

          ??????????? log.info("hello 方法執(zhí)行完畢");

          ??????? } catch (Exception e) {

          ??????????? System.out.println("[ERROR]" + e.getMessage());

          ??????? }

          ??????? return result;

          ??? }

          ?

          }

          ???? IHell.java

          ?

          package com.kela.spring.aop;

          ?

          public interface IHello {

          ??? public void hello(String name);

          }

          ???? HelloSpeaker.java

          ?

          package com.kela.spring.aop;

          ?

          public class HelloSpeaker implements IHello {

          ?

          ??? public void hello(String name) {

          ??????? System.out.println(" 你好," + name);

          ??? }

          }

          ???? ProxyDemo.java

          ?

          package com.kela.spring.aop;

          ?

          public class ProxyDemo {

          ???

          ??? public void method_2() {

          ??????? LogHandler logHandler = new LogHandler();

          ???????

          ??????? IHello helloProxy = (IHello)logHandler.bind(new HelloSpeaker());

          ???????

          ??????? helloProxy.hello("kela");

          ??? }

          ?

          ??? public static void main(String[] args) {

          ??????? ProxyDemo proxyDemo = new ProxyDemo();

          ???????

          ??????? proxyDemo.method_2();

          ??? }

          }

          ???? 學(xué)習(xí)小結(jié)

          ?

          使用代理對(duì)象將記錄等于業(yè)務(wù)邏輯無(wú)關(guān)的動(dòng)作或任務(wù)提取出來(lái),設(shè)計(jì)為一個(gè)服務(wù)對(duì)象,如LogHandler和上一小節(jié)中的HelloProxy,這樣的對(duì)象稱之為切面(Aspect)。

          分享到:
          主站蜘蛛池模板: 普安县| 鄯善县| 沛县| 阳新县| 会理县| 松阳县| 尼木县| 九龙城区| 屏山县| 高邑县| 交口县| 郴州市| 太白县| 昭通市| 融水| 宣武区| 宁河县| 大连市| 新巴尔虎右旗| 普格县| 三原县| 临清市| 文登市| 抚州市| 张北县| 安顺市| 顺昌县| 天气| 莱阳市| 乌拉特前旗| 崇仁县| 蛟河市| 遂溪县| 泽普县| 潜江市| 嘉黎县| 锡林郭勒盟| 桃江县| 雷波县| 康定县| 德昌县|