Kela's Blog

            前面的路很坎坷,但毕竟是条路.也许走过这一段就会发现,走过去就是梦想中的地方.因此坚持成为此刻唯一能做且必须去做的事情.
posts - 9, comments - 27, trackbacks - 0, articles - 15

kela的笔记 应用程序框架 ---- spring(7)

Posted on 2006-08-29 16:35 Kela 阅读(167) 评论(0)  编辑  收藏 所属分类: 我的笔记(Spring)

摘要:Spring AOP ,从代理机制看AOP,动态代理的范例

 

JDK1.3之后加入了可协助开发动态代理功能的API,你不必为特定对象与方法编写特定的代理对象,使用动态代理,可以使用一个处理者(Handler)服务于各个对象。

 

     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 方法开始执行... ...");

           

            result = method.invoke(delegate, args);

           

            log.info("hello 方法执行完毕");

        } 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();

    }

}

     学习小结

 

使用代理对象将记录等于业务逻辑无关的动作或任务提取出来,设计为一个服务对象,如LogHandler和上一小节中的HelloProxy,这样的对象称之为切面(Aspect)。


只有注册用户登录后才能发表评论。


网站导航:
 
分享到: