如何在不使用spring框架中使用aop的功能
Spring框架的AOP機(jī)制可以讓開發(fā)者把業(yè)務(wù)流程中的通用功能抽取出來,單獨(dú)編寫功能代碼。在業(yè)務(wù)流程執(zhí)行過程中,Spring框架會(huì)根據(jù)業(yè)務(wù)流程要求,自動(dòng)把獨(dú)立編寫的功能代碼切入到流程的合適位置。
spring提供了兩種方式的AOP使用
使用xml配置方式
使用注解方式
這里需要注意的是Spring AOP目前僅僅支持方法級別的切面,成員的interception并沒有實(shí)現(xiàn)。另外,spring aop僅僅是集成框架,并沒有參與aop的具體開發(fā)。
如果想利用aop的更多功能,或者在不使用spring的框架中使用aop的功能,該怎么辦呢?
AspectJ簡介
spring aop集成了AspectJ(可以和java編程語言無縫結(jié)合的一個(gè)面向切面編程的可擴(kuò)展框架)
AspectJ的使用實(shí)例
Eclipse Marketplace安裝插件AJDT
創(chuàng)建Aspect工程
創(chuàng)建AspectJ測試類
創(chuàng)建一個(gè)切面Aspect文件
.aj文件
運(yùn)行HelloAspectJDemo的java程序,結(jié)果為:
不使用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("張三"); ?} }
第二種:通過面向接口編程實(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; ?//在該類中針對前面的接口TimeBookInterface編程,而不是針對具體的類 ?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; ?//綁定代理對象 ?public Object bind(Object delegate){undefined ? this.delegate = delegate; ? return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), ? ? delegate.getClass().getInterfaces(),this); ?} ?//針對接口編程 ?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; //針對接口編程 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)了對日志類的重用 ? LogProxy logProxy = new LogProxy(); ? TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook()); ? timeBookProxy.doAuditing("張三"); ?} }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談java 增強(qiáng)型的for循環(huán) for each
下面小編就為大家?guī)硪黄獪\談java 增強(qiáng)型的for循環(huán) for each。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10用Java實(shí)現(xiàn)全國天氣預(yù)報(bào)的api接口調(diào)用示例
查詢天氣預(yù)報(bào)在APP中常用的一個(gè)常用功能,本文實(shí)例講述了java調(diào)用中國天氣網(wǎng)api獲得天氣預(yù)報(bào)信息的方法。分享給大家供大家參考。2016-10-10SpringBoot消息國際化配置實(shí)現(xiàn)過程解析
這篇文章主要介紹了SpringBoot消息國際化配置實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java中EasyPoi多sheet導(dǎo)出功能實(shí)現(xiàn)
這篇文章主要介紹了Java中EasyPoi多sheet導(dǎo)出功能實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01詳解SpringBoot實(shí)現(xiàn)事件同步與異步監(jiān)聽
這篇文章主要通過示例為大家詳細(xì)介紹了SpringBoot中的事件的用法和原理以及如何實(shí)現(xiàn)事件同步與異步監(jiān)聽,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06SpringBoot整合MongoDB實(shí)現(xiàn)文件上傳下載刪除
這篇文章主要介紹了SpringBoot整合MongoDB實(shí)現(xiàn)文件上傳下載刪除的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下2021-05-05