最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java使用動(dòng)態(tài)代理來實(shí)現(xiàn)AOP(日志記錄)的實(shí)例代碼

 更新時(shí)間:2013年09月27日 15:31:57   作者:  
AOP(面向方面)的思想,就是把項(xiàng)目共同的那部分功能分離開來,比如日志記錄,避免在業(yè)務(wù)邏輯里面夾雜著跟業(yè)務(wù)邏輯無關(guān)的代碼

下面是一個(gè)AOP實(shí)現(xiàn)的簡(jiǎn)單例子:

首先定義一些業(yè)務(wù)方法:

復(fù)制代碼 代碼如下:

/**
 * Created with IntelliJ IDEA.
 * Author: wangjie  email:tiantian.china.2@gmail.com
 * 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";
    }

}


復(fù)制代碼 代碼如下:

/**
 * Created with IntelliJ IDEA.
 * Author: wangjie  email:tiantian.china.2@gmail.com
 * 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";
    }
}


實(shí)現(xiàn)InvocationHandler接口,使用map來存儲(chǔ)不同的InvocationHandler對(duì)象,避免生成過多。

復(fù)制代碼 代碼如下:

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:tiantian.china.2@gmail.com
 * Date: 13-9-23
 * Time: 下午3:47
 */
public class LogInvoHandler implements InvocationHandler{
    private Logger logger = Logger.getLogger(this.getClass().getSimpleName());

    private Object target; // 代理目標(biāo)
    private Object proxy; // 代理對(duì)象

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

    private LogInvoHandler() {
    }

    /**
     * 通過Class來生成動(dòng)態(tài)代理對(duì)象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); // 執(zhí)行業(yè)務(wù)處理

        // 打印日志
        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;
    }
}


然后編寫一個(gè)Test類測(cè)試:

復(fù)制代碼 代碼如下:

/**
 * Created with IntelliJ IDEA.
 * Author: wangjie  email:tiantian.china.2@gmail.com
 * 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();

    }
}


以后需要添加新的業(yè)務(wù)邏輯XXXService,只需要調(diào)用

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對(duì)象

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

再使用反射去調(diào)用代理對(duì)象的方法。

 

運(yùn)行結(jié)果如下:

九月 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

相關(guān)文章

  • mybatis-plus自動(dòng)生成代碼的示例代碼

    mybatis-plus自動(dòng)生成代碼的示例代碼

    這篇文章主要介紹了mybatis-plus自動(dòng)生成代碼的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 在Java SE上使用Headless模式的超級(jí)指南

    在Java SE上使用Headless模式的超級(jí)指南

    這篇文章主要介紹了在Java SE上使用Headless模式的超級(jí)指南,文中介紹了Headless模式實(shí)際使用的各種技巧,極力推薦!需要的朋友可以參考下
    2015-07-07
  • SpringBoot通過redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)

    SpringBoot通過redisTemplate調(diào)用lua腳本并打印調(diào)試信息到redis log(方法步驟詳解)

    這篇文章主要介紹了SpringBoot通過redisTemplate調(diào)用lua腳本 并打印調(diào)試信息到redis log,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 基于Java實(shí)現(xiàn)簡(jiǎn)單的郵件群發(fā)功能

    基于Java實(shí)現(xiàn)簡(jiǎn)單的郵件群發(fā)功能

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言編寫一個(gè)簡(jiǎn)單的工具類,可以實(shí)現(xiàn)郵件群發(fā)功能。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • java文件和目錄的增刪復(fù)制

    java文件和目錄的增刪復(fù)制

    這篇文章主要為大家詳細(xì)介紹了java文件和目錄的增刪復(fù)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 在idea中g(shù)it pull失敗的解決方案

    在idea中g(shù)it pull失敗的解決方案

    在遇到Git Pull失敗時(shí),首先使用IDEA的git-revert功能進(jìn)行還原,然后檢查并解決分支沖突,最后重新執(zhí)行Git Pull確保所有文件是最新的,注意,在操作過程中確保網(wǎng)絡(luò)連接正常,并且每步操作后都要執(zhí)行Git Pull來更新數(shù)據(jù)
    2024-10-10
  • Java循環(huán)嵌套詳解及經(jīng)典列題

    Java循環(huán)嵌套詳解及經(jīng)典列題

    這篇文章主要給大家介紹了關(guān)于Java循環(huán)嵌套詳解及經(jīng)典列題,包括循環(huán)嵌套的結(jié)構(gòu)、變量作用域、不同類型循環(huán)的嵌套等,通過示例和經(jīng)典練習(xí)題,展示了如何使用循環(huán)嵌套解決實(shí)際問題,需要的朋友可以參考下
    2024-12-12
  • SpringBoot上傳圖片到指定位置并返回URL的實(shí)現(xiàn)

    SpringBoot上傳圖片到指定位置并返回URL的實(shí)現(xiàn)

    本文主要介紹了SpringBoot上傳圖片到指定位置并返回URL,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2022-03-03
  • Java獲取隨機(jī)數(shù)的n種方法

    Java獲取隨機(jī)數(shù)的n種方法

    項(xiàng)目中,我們常常會(huì)用到隨機(jī)數(shù),本文主要介紹了Java獲取隨機(jī)數(shù)的n種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問題及解決

    SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問題及解決

    這篇文章主要介紹了SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

阿拉尔市| 贵港市| 新余市| 旌德县| 朝阳县| 五原县| 扶余县| 汨罗市| 塘沽区| 抚松县| 衡阳县| 泸定县| 曲麻莱县| 黄山市| 织金县| 平果县| 清流县| 应城市| 蒙自县| 疏勒县| 北川| 绵竹市| 习水县| 会泽县| 柞水县| 当雄县| 南岸区| 肥乡县| 江华| 巴楚县| 浙江省| 扶风县| 全州县| 许昌县| 长乐市| 井研县| 乐山市| 沿河| 莱西市| 兴隆县| 靖远县|