<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            java語言

            java使用動態代理來實現AOP

            時間:2025-01-24 12:05:08 java語言 我要投稿
            • 相關推薦

            java使用動態代理來實現AOP

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

              首先定義一些業務方法:

              復制代碼 代碼如下:

              /**

              * 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";

              }

              }

              復制代碼 代碼如下:

              /**

              * 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";

              }

              }

              實現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: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; // 代理目標

              private Object proxy; // 代理對象

              private static HashMap<Class, LogInvoHandler>();

              private LogInvoHandler() {

              }

              /**

              * 通過Class來生成動態代理對象Proxy

              * @param clazz

              * @return

              */

              public synchronized staticT getProxyInstance(Classclazz){

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

              }

              }

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

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

              即可。

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

              

              然后在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

              

            【java使用動態代理來實現AOP】相關文章:

            java利用反射實現動態代理實現代碼05-18

            講解Java的Spring框架中的AOP實現04-13

            關于Java動態實現的方法04-20

            JAVA的動態代理分析04-28

            Java中如何實現顯示動態的時間03-14

            Java中基于Aspectwerkz的AOP開發06-07

            幾分鐘理解Java中的動態代理07-25

            java使用ConcurrentHashMap和計數器實現鎖的方法05-31

            如何使用java來進行加減乘除運算01-15

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看