溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在不使用spring框架中使用aop的功能

發(fā)布時(shí)間:2022-01-04 00:36:11 來(lái)源:億速云 閱讀:237 作者:柒染 欄目:開發(fā)技術(shù)

本篇文章為大家展示了怎么在不使用spring框架中使用aop的功能,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

Spring框架的AOP機(jī)制可以讓開發(fā)者把業(yè)務(wù)流程中的通用功能抽取出來(lái),單獨(dú)編寫功能代碼。在業(yè)務(wù)流程執(zhí)行過(guò)程中,Spring框架會(huì)根據(jù)業(yè)務(wù)流程要求,自動(dòng)把獨(dú)立編寫的功能代碼切入到流程的合適位置。

spring提供了兩種方式的AOP使用

使用xml配置方式

怎么在不使用spring框架中使用aop的功能

使用注解方式

怎么在不使用spring框架中使用aop的功能

這里需要注意的是Spring AOP目前僅僅支持方法級(jí)別的切面,成員的interception并沒(méi)有實(shí)現(xiàn)。另外,spring aop僅僅是集成框架,并沒(méi)有參與aop的具體開發(fā)。

如果想利用aop的更多功能,或者在不使用spring的框架中使用aop的功能,該怎么辦呢?

AspectJ簡(jiǎn)介

怎么在不使用spring框架中使用aop的功能

spring aop集成了AspectJ(可以和java編程語(yǔ)言無(wú)縫結(jié)合的一個(gè)面向切面編程的可擴(kuò)展框架)

AspectJ的使用實(shí)例

Eclipse Marketplace安裝插件AJDT

怎么在不使用spring框架中使用aop的功能

創(chuàng)建Aspect工程

怎么在不使用spring框架中使用aop的功能

創(chuàng)建AspectJ測(cè)試類

怎么在不使用spring框架中使用aop的功能

創(chuàng)建一個(gè)切面Aspect文件

怎么在不使用spring框架中使用aop的功能

.aj文件

怎么在不使用spring框架中使用aop的功能

運(yùn)行HelloAspectJDemo的java程序,結(jié)果為:

怎么在不使用spring框架中使用aop的功能

不使用spring的aop功能實(shí)現(xiàn)日志輸出

第一種

public class TimeBook {undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 //審核數(shù)據(jù)的相關(guān)程序
 public void doAuditing(String name){undefined
  logger.log(Level.INFO, name + "開始審核數(shù)據(jù)...");
  System.out.println("審核程序");
  logger.log(Level.INFO, name + "審核數(shù)據(jù)結(jié)束...");
 }
}
//TestHelloWorld.java
package com.gc.test;
import com.gc.action.TimeBook;
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  TimeBook timeBook = new TimeBook();
  timeBook.doAuditing("張三");
 }
}

第二種:通過(guò)面向接口編程實(shí)現(xiàn)日志輸出

public class TimeBook implements TimeBookInterface {undefined
 //審核數(shù)據(jù)的相關(guān)程序
 public void doAuditing(String name){undefined
  System.out.println("審核程序");
 }
}
//TimeBookProxy.java
package com.gc.action;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import com.gc.impl.TimeBookInterface;
public class TimeBookProxy {undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 private TimeBookInterface timeBookInterface;
 //在該類中針對(duì)前面的接口TimeBookInterface編程,而不是針對(duì)具體的類
 public TimeBookProxy(TimeBookInterface timeBookInterface){undefined
  this.timeBookInterface = timeBookInterface;
 }
 //實(shí)際業(yè)務(wù)處理
 public void doAuditing(String name){undefined
  logger.log(Level.INFO,"開始審核數(shù)據(jù) "+name);
  timeBookInterface.doAuditing(name);
  logger.log(Level.INFO,"審核數(shù)據(jù)結(jié)束 "+name);
 }
}
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());
  timeBookProxy.doAuditing("張三");
 }
}

第三種:使用java的代理機(jī)制進(jìn)行日志輸出

public class LogProxy implements InvocationHandler{undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 private Object delegate;
 //綁定代理對(duì)象
 public Object bind(Object delegate){undefined
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    delegate.getClass().getInterfaces(),this);
 }
 //針對(duì)接口編程
 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {undefined
  Object result = null;
  try{undefined
   //在方法調(diào)用前后進(jìn)行日志輸出
   logger.log(Level.INFO,args[0]+" 開始審核數(shù)據(jù)...");
   result = method.invoke(delegate, args);
   logger.log(Level.INFO,args[0]+" 審核數(shù)據(jù)結(jié)束...");
  }catch(Exception e){undefined
   logger.log(Level.INFO,e.toString());
  }
  return result;
 }
}
//TimeBookInterface.java
package com.gc.impl;
//針對(duì)接口編程
public interface TimeBookInterface {undefined
 public void doAuditing(String name);
}
//TimeBook.java
public class TimeBook implements TimeBookInterface {undefined
 //審核數(shù)據(jù)的相關(guān)程序
 public void doAuditing(String name){undefined
  System.out.println("審核程序");
 }
}
//TestHelloWorld.java
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  //實(shí)現(xiàn)了對(duì)日志類的重用
  LogProxy logProxy = new LogProxy();
  TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
  timeBookProxy.doAuditing("張三");
 }
}

上述內(nèi)容就是怎么在不使用spring框架中使用aop的功能,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI