AOP入门 - 1

8 篇文章 0 订阅

AOP-Aspect-oriented programming

    从代理机制初控AOP
    如想在执行HelloSpeaker的hello()方法时留下日志消息,可以在hello()方法内部写log,或者说将执行log的程序横切入(Cross-cutting)到HelloSpeaker,但这样就使得HelloSpeaker关注了不属于它自己的业务逻辑。如果可以采取的代理的机制。
   
    代理(Proxy)有两种:
    静态代理-Static proxy
    动态代理-Dynamic proxy

 

1. 静态代理
    为实现静态代理需要为HelloSpeaker写一个HelloProxy类,同样实现IHello接口,并在hello方法执行log,并执行HelloSpeaker的hello()方法。
    public void hello(String name){
        log(“hello method start”);
        helloObject.hello(name);
        log(“hello method end….”);
    }

其中helloObject为需要代理的对象,在其它地方如下来使用代理机制:
IHello proxy = new HelloProxy(new HelloSpeaker());
proxy.hello(“test”);

 

示例图:

 

2. 动态代理

import java.util.logging.*;
import java.lang.reflect.*;
                                                                                       
public class LogHandler implements InvocationHandler {
    private Logger logger =
            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 proxy, Method method,
                         Object[] args) throws Throwable {
        Object result = null;        
        try {
            log("method starts..." + method);
           
            result = method.invoke(delegate, args);
           
            logger.log(Level.INFO, "method ends..." + method);
        } catch (Exception e){
            log(e.toString());
        }       
        return result;
    }
   
    private void log(String message) {
        logger.log(Level.INFO, message);
    }
}

 

 

测试程序如下:

 

public static void main(String[] args) {

        LogHandler logHandler  = new LogHandler();

       

        IHello helloProxy =

                (IHello) logHandler.bind(new HelloSpeaker());

        helloProxy.hello("Justin");

    }

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值