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

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

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

下面是一個AOP實現(xià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";
    }
}


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

復(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; // 代理對象

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

    private LogInvoHandler() {
    }

    /**
     * 通過Class來生成動態(tài)代理對象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;
    }
}


然后編寫一個Test類測試:

復(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對象

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

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

 

運行結(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自動生成代碼的示例代碼

    mybatis-plus自動生成代碼的示例代碼

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

    在Java SE上使用Headless模式的超級指南

    這篇文章主要介紹了在Java SE上使用Headless模式的超級指南,文中介紹了Headless模式實際使用的各種技巧,極力推薦!需要的朋友可以參考下
    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ì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 基于Java實現(xiàn)簡單的郵件群發(fā)功能

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

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

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

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

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

    在遇到Git Pull失敗時,首先使用IDEA的git-revert功能進行還原,然后檢查并解決分支沖突,最后重新執(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)嵌套解決實際問題,需要的朋友可以參考下
    2024-12-12
  • SpringBoot上傳圖片到指定位置并返回URL的實現(xiàn)

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

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

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

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

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

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

最新評論

重庆市| 阳谷县| 沧源| 定襄县| 新田县| 苗栗县| 承德市| 富阳市| 大埔县| 泸定县| 武威市| 瑞丽市| 峨眉山市| 潜山县| 双牌县| 元氏县| 鄂伦春自治旗| 巴南区| 湟源县| 洪江市| 凉山| 广南县| 牟定县| 临城县| 自贡市| 克山县| 娄底市| 定兴县| 乌拉特中旗| 定襄县| 定西市| 通化市| 资溪县| 柞水县| 灌南县| 开平市| 庆城县| 师宗县| 安西县| 会昌县| 云安县|