麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

java使用動態代理來實現AOP(日志記錄)的實例代碼

2019-11-26 15:57:38
字體:
來源:轉載
供稿:網友

下面是一個AOP實現的簡單例子:

首先定義一些業務方法:

復制代碼 代碼如下:

/**
 * Created with IntelliJ IDEA.
 * Author: wangjie  email:[email protected]
 * Date: 13-9-23
 * Time: 下午3:49
 */
public interface BussinessService {
    public String login(String username, String password);
    public String find();
}

public class BussinessServiceImpl implements BussinessService {
    private Logger logger = Logger.getLogger(this.getClass().getSimpleName());

    @Override
    public String login(String username, String password) {
        return "login success";
    }

    @Override
    public String find() {
        return "find success";
    }

}


復制代碼 代碼如下:

/**
 * Created with IntelliJ IDEA.
 * Author: wangjie  email:[email protected]
 * Date: 13-9-24
 * Time: 上午10:27
 */
public interface WorkService {
    public String work();
    public String sleep();
}

public class WorkServiceImpl implements WorkService{
    @Override
    public String work() {
        return "work success";
    }

    @Override
    public String sleep() {
        return "sleep success";
    }
}


實現InvocationHandler接口,使用map來存儲不同的InvocationHandler對象,避免生成過多。

復制代碼 代碼如下:

package com.wangjie.aoptest2.invohandler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.HashMap;
import java.util.logging.Logger;

/**
 * Created with IntelliJ IDEA.
 * Author: wangjie  email:[email protected]
 * Date: 13-9-23
 * Time: 下午3:47
 */
public class LogInvoHandler implements InvocationHandler{
    private Logger logger = Logger.getLogger(this.getClass().getSimpleName());

    private Object target; // 代理目標
    private Object proxy; // 代理對象

    private static HashMap<Class<?>, LogInvoHandler> invoHandlers = new HashMap<Class<?>, LogInvoHandler>();

    private LogInvoHandler() {
    }

    /**
     * 通過Class來生成動態代理對象Proxy
     * @param clazz
     * @return
     */
    public synchronized static<T> T getProxyInstance(Class<T> clazz){
        LogInvoHandler invoHandler = invoHandlers.get(clazz);

        if(null == invoHandler){
            invoHandler = new LogInvoHandler();
            try {
                T tar = clazz.newInstance();
                invoHandler.setTarget(tar);
                invoHandler.setProxy(Proxy.newProxyInstance(tar.getClass().getClassLoader(),
                        tar.getClass().getInterfaces(), invoHandler));
            } catch (Exception e) {
                e.printStackTrace();
            }
            invoHandlers.put(clazz, invoHandler);

        }

        return (T)invoHandler.getProxy();
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result = method.invoke(target, args); // 執行業務處理

        // 打印日志
        logger.info("____invoke method: " + method.getName()
                    + "; args: " + (null == args ? "null" : Arrays.asList(args).toString())
                    + "; return: " + result);


        return result;
    }

    public Object getTarget() {
        return target;
    }

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        return proxy;
    }

    public void setProxy(Object proxy) {
        this.proxy = proxy;
    }
}


然后編寫一個Test類測試:

復制代碼 代碼如下:

/**
 * Created with IntelliJ IDEA.
 * Author: wangjie  email:[email protected]
 * Date: 13-9-24
 * Time: 上午9:54
 */
public class Test {
    public static Logger logger = Logger.getLogger(Test.class.getSimpleName());
    public static void main(String[] args) {

        BussinessService bs = LogInvoHandler.getProxyInstance(BussinessServiceImpl.class);
        bs.login("zhangsan", "123456");
        bs.find();

        logger.info("--------------------------------------");

        WorkService ws = LogInvoHandler.getProxyInstance(WorkServiceImpl.class);
        ws.work();
        ws.sleep();

        logger.info("--------------------------------------");

        BussinessService bss = LogInvoHandler.getProxyInstance(BussinessServiceImpl.class);
        bss.login("lisi", "654321");
        bss.find();

    }
}


以后需要添加新的業務邏輯XXXService,只需要調用

XXXService xs = LogInvoHandler.getProxyInstance(XXXServiceImpl.class);

即可。

也可以模仿Spring等框架的配置,把bean的類名配置在xml文件中,如:

<bean id="bussinessService" class="com.wangjie.aoptest2.service.impl.BussinessServiceImpl">

然后在java代碼中解析xml,通過Class.forName("com.wangjie.aoptest2.service.impl.BussinessServiceImpl");獲得Class對象

然后通過LogInvoHandler.getProxyInstance(Class.forName("com.wangjie.aoptest2.service.impl.BussinessServiceImpl"));獲得代理對象Proxy

再使用反射去調用代理對象的方法。

 

運行結果如下:

九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.invohandler.LogInvoHandler invoke
INFO: ____invoke method: login; args: [zhangsan, 123456]; return: login success
九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.invohandler.LogInvoHandler invoke
INFO: ____invoke method: find; args: null; return: find success
九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.Test main
INFO: --------------------------------------
九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.invohandler.LogInvoHandler invoke
INFO: ____invoke method: work; args: null; return: work success
九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.invohandler.LogInvoHandler invoke
INFO: ____invoke method: sleep; args: null; return: sleep success
九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.Test main
INFO: --------------------------------------
九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.invohandler.LogInvoHandler invoke
INFO: ____invoke method: login; args: [lisi, 654321]; return: login success
九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.invohandler.LogInvoHandler invoke
INFO: ____invoke method: find; args: null; return: find success

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人午夜免费网站 | 国产亚洲精品综合一区 | 成人羞羞视频在线观看 | va视频在线观看 | 国产精品视频在线观看免费 | av中文字幕免费在线观看 | 久久人人爽人人爽人人片av高请 | 日韩一级片 | 午夜伦情电午夜伦情电影 | 久久日韩 | 在线看毛片的网站 | 久久网日本 | 亚洲片在线 | 毛片免费在线视频 | 精精国产xxxx视频在线播放7 | 国产资源在线看 | 黄色久| 黄网在线 | 好吊色37pao在线观看 | 欧美精品99 | 欧美成人se01短视频在线看 | 中文字幕在线观看精品 | 黄网站色成年大片免费高 | www.成人在线 | av观看国产 | avav在线播放 | 911网站大全在线观看 | 羞羞视频免费观看入口 | 999精品国产 | 视频一区 日韩 | 日本68xxxx | 欧美日本91精品久久久久 | 免费看性xxx高清视频自由 | 午夜在线视频一区二区三区 | 久久久久久免费 | 欧美成人理论片乱 | 免费一级毛片观看 | 午夜视| 久久精品99北条麻妃 | 视频一区二区久久 | 久久精品成人影院 |