日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring 面向接口编程_Spring面向方面的编程

發布時間:2023/12/3 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring 面向接口编程_Spring面向方面的编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spring 面向接口編程

介紹

在理想的面向對象系統中,我們希望將每個對象設計為執行一項特定任務。 但是,除了執行其主要任務之外,對象還執行被動任務,例如日志記錄,事務,安全性,緩存等。這些被動活動是必需的,但不是業務邏輯的一部分,被稱為“ 跨切問題 ”。

(橫切關注點==系統中常用的功能)

橫切關注點與業務邏輯分開可以是編寫精心設計的解耦代碼的重要一步。 讓我們思考一下解決交叉切割問題的方法

遺產

繼承立即在腦海中彈出,我們可以繼承通用功能并在對象中使用它。 但是繼承通用功能需要我們設計一個基類。 如果我們在多個地方重用該類,那么以后修改類可能會很困難。

繼承==以后很難修改(非彈性代碼)

代表團

委派是處理交叉切割問題的更好方法。 記住組成要重于繼承,(授權和組成要共同關注)。 但是,然后我們將不得不在許多地方進行調用以委托對象,從而使其變得繁瑣。

委派==繁瑣

面向方面的編程

這是否意味著我們要喝湯了。 相反,這給我們留下了第三種也是最好的方法,即面向方面的編程。 AOP避免了繼承的脆弱性和委派的繁瑣性。 AOP在相互交叉的關注點領域大放異彩

什么是AOP?

AOP允許我們將橫切關注點模塊化到稱為Aspects的特殊對象中,從而創建更清晰和分離的代碼。 有了適當的方面,對象就不必擔心執行被動橫切問題,因為AOP會處理所有這些問題。

與AOP有關的術語

像任何成功的技術一樣,AOP也具有自己的術語和術語集。 讓我們先看一下那些,然后再進行更深入的了解AOP的工作。

  • 關注點 -這些是基于其功能模塊化的系統的一部分。 有兩種類型的關注點。 1.核心關注點2.跨領域關注點。 核心關注點與系統的業務邏輯有關,即系統執行的主動任務,例如生成工資單,獲取員工記錄,進行銀行轉賬等。跨部門關注點是執行主動任務(例如日志記錄,緩存)所需的被動任務等等
  • 連接點–連接點是執行流程中的一個點,其中發生了一些動作,并且有可能應用Aspect(跨領域關注點)。 連接點可以是被調用的方法,拋出異常或對象狀態改變。
  • 建議 – AOP中的每個方面都有其目的,即必須完成的工作。 該作業必須在連接點處應用。 方面的工作或目的稱為建議。 除了定義方面的工作之外,建議還定義方面執行工作的時間。 應該在核心關注事項完成執行之前或之后應用作業,還是在兩者之前和之后應用作業。
  • 切入點 –系統中可以有許多連接點,但并非所有方面都由Aspect建議。 Aspect從Pointcut獲得幫助,以選擇要在其中編織建議的Joinpoint。
  • 方面 –建議和切入點定義了方面。 正如我們看到的,建議定義了方面的工作以及何時執行。 雖然Pointcut定義了方面編織建議的位置。 因此,工作的內容,時間和地點定義了方面。
  • 目標 –目標是被建議的對象。 (核心關注)。 在AOP的幫助下,該對象可以自由地執行其主要任務,而不必擔心交叉問題。
  • 代理 –將建議應用于目標對象時,將創建一個代理對象。 AOP容器創建并管理對象的生命周期,程序員無需擔心它們。
  • 編織 –編織是將Advice或Aspect應用于目標對象以創建代理對象的過程。 編織可以在編譯時或類加載時或在運行時完成。 通常,Spring AOP在運行時將方面編織到目標對象中。
  • 那是要消化的一長串術語。 在繼續之前,請花點時間了解它們。

    咨詢類型

    在沉迷于示例之前的最后一篇文章是了解建議的類型。 主要有4種建議。

  • 建議之前 –在Joinpoint開始執行之前應用建議之前。 通過實現org.springframework.aop.MethodBeforeAdvice接口來創建BeforeAdvice。 要實現的方法是公共無效(方法m,對象args [],對象目標)拋出Throwable
  • 返回建議之后–在Joinpoint完成執行之后應用建議之后。 AfterReturningAdvice是通過實現org.springframework.aop.AfterReturningAdvice接口創建的。 ThingableReturning(Method m,Object args [],Object target)拋出之后 ,要實現的方法是公共無效
  • 引發建議 –當Joinpoint在執行過程中引發異常時,將應用引發建議。
  • 圍繞建議 –此建議圍繞Joinpoint執行,并在Joinpoint執行之前和之后執行。 這甚至可以用來控制Joinpoint的調用。
  • 我們將嘗試在SpringAOP的幫助下開發一個簡單的緩存。 緩存具有三個主要的核心問題。

    核心關注點

  • 將對象保存在緩存中。
  • 從緩存返回對象。
  • 從緩存中刪除對象。
  • 現在,除了這些核心問題之外,緩存框架還有其他被動任務。 這些被動任務構成了交叉問題。

    橫切關注點

  • 達到其大小限制時重新調整緩存大小。 (LRU)實施。
  • 鎖定對象以防止在讀取對象時將其刪除。
  • 鎖定高速緩存以防止在調整大小時阻止和讀取/寫入/刪除高速緩存。
  • 編碼所有這些橫切關注點可能是耗時且乏味的,因此讓我們簡化示例,當緩存已滿時,我們將僅實現調整大小邏輯。 因此,在完成示例之后,我們將擁有一個可以放置,獲取和刪除對象的緩存。 例如,緩存的最大大小已設置為10。 一旦高速緩存存儲了10個對象,則對高速緩存的任何添加都將導致通過刪除第一個對象來刪除(重新調整大小)高速緩存。 調整大小的操作由使用Spring AOP創建的Aspect控制。 這是示例中要遵循的步驟

    可以從SVN此處下載示例代碼: https : //www.assembla.com/code/weblog4j/subversion/nodes/31/SpringDemos/trunk

  • 依賴關系 – AOP是spring的核心功能,因此要使Spring AOP正常運行,我們需要的是核心spring jar,因此在您的POM中添加以下依賴關系。 <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency>
  • 核心緩存對象。 package com.aranin.spring.aop;import java.util.Date; import java.util.LinkedHashMap; import java.util.Map;public class MyCache {private LinkedHashMap<String, Object> cacheMap = new LinkedHashMap<String, Object>();private LinkedHashMap<String, Date> timeStampMap = new LinkedHashMap<String, Date>();/*** defines the max size of hashmap*/private long maxsize = 10; //should come from properties file or some configuration/*** how long the object should be stored before it is evicted from cache*/private long objectLifeTime = 10000;private boolean lock = false;public LinkedHashMap<String, Object> getCacheMap() {return cacheMap;}public void setCacheMap(LinkedHashMap<String, Object> cacheMap) {this.cacheMap = cacheMap;}public LinkedHashMap<String, Date> getTimeStampMap() {return timeStampMap;}public void setTimeStampMap(LinkedHashMap<String, Date> timeStampMap) {this.timeStampMap = timeStampMap;}public long getMaxsize() {return maxsize;}public void setMaxsize(long maxsize) {this.maxsize = maxsize;}public long getObjectLifeTime() {return objectLifeTime;}public void setObjectLifeTime(long objectLifeTime) {this.objectLifeTime = objectLifeTime;}public boolean isLock() {return lock;}public void setLock(boolean lock) {this.lock = lock;}/*** This method is used to retrive the object from cache* @param key* @return*/public Object get(String key){return this.getCacheMap().get(key);}/*** this method is used for putting an object in cache* @param key* @param object*/public void put(String key, Object object){//get the curr dateDate date = new Date(System.currentTimeMillis());//set object in cacheMapthis.getCacheMap().put(key,object);//put timestamp in cachethis.getTimeStampMap().put(key, date);}public void delete(String key){this.getCacheMap().remove(key);this.getTimeStampMap().remove(key);}public void clearAll(){this.setCacheMap(new LinkedHashMap<String, Object>());this.setTimeStampMap(new LinkedHashMap<String, Date>());}/*** remove last 2 entries* not worried about object life time* this is just an example*/public void resize(){System.out.println("inside resize");long size = this.getCacheMap().size();System.out.println("size + " + size);if(size == this.getMaxsize()){System.out.println("max size has reached");Map.Entry<String, Date> firstEntry = this.getTimeStampMap().entrySet().iterator().next();System.out.println("removing : " + firstEntry.getKey() + " value : " + firstEntry.getValue());this.timeStampMap.remove(firstEntry.getKey());Map.Entry<String, Object> firstCEntry = this.getCacheMap().entrySet().iterator().next();System.out.println("removing : " + firstCEntry.getKey() + " value : " + firstCEntry.getValue());this.cacheMap.remove(firstCEntry.getKey());}System.out.println("leaving resize with size : " + this.getCacheMap().size());} }

    這個課沒什么好說的。 有兩個LinkedHashMaps,一個用于存儲對象,另一個用于存儲將對象推入緩存時的時間戳。 最大大小設置為10,并且具有get,put和delete方法。 還有一個調整大小的方法,Aspect將調用此方法,稍后我們將進行檢查。

  • 調整建議 package com.aranin.spring.aop;import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;public class ResizeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("invoking " + method.getName() + " on " + target.getClass() + " Object");if(method.getName().equals("put")){System.out.println("before invoking " + method.getName());((MyCache)target).resize();}} }

    如您所見,這是建議之前的一種方法。 類實現MethodBeforeAdvice接口,該接口包含單個方法before()。 如果您檢查該方法,則在我們調用put方法時,將檢查rezise方法是否被調用。

  • Spring上下文springaopdemo.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd"><bean id="resizeAdvice" class="com.aranin.spring.aop.ResizeAdvice" /><bean id="myCache" class="com.aranin.spring.aop.MyCache" /><bean id="myAOPCache"class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target" ref="myCache" /><property name="interceptorNames"><list><value>resizeAdvice</value></list></property></bean> </beans>

    如果您注意到上述xml文件,則MyCache和ResizeAdvice均已注冊為spring bean。 文件中的主要bean是myAOPCache。 這是spring aop在核心類上應用建議后創建的代理對象。 代理對象由ProxyFactoryBean類創建。 我們將myCache對象的引用傳遞給代理對象,并注冊所有將應用于代理類的建議。

  • 最后,讓我們檢查Client,這將有助于我們運行此演示。 package com.aranin.spring.aop;import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext;public class MyCacheClient {public static void main(String[] args){ApplicationContext springcontext = new FileSystemXmlApplicationContext("D:/samayik/SpringDemos/src/main/resources/springaopdemo.xml");MyCache myCache = (MyCache)springcontext.getBean("myAOPCache");myCache.put("1", "1");myCache.put("2", "2");myCache.put("3", "3");myCache.put("4", "4");myCache.put("5", "5");myCache.put("6", "6");myCache.put("7", "7");myCache.put("8", "8");myCache.put("9", "9");myCache.put("10", "10");System.out.println((String)myCache.get("1"));System.out.println((String)myCache.get("2"));System.out.println((String)myCache.get("10"));myCache.put("11", "11");System.out.println((String)myCache.get("1"));System.out.println((String)myCache.get("2"));System.out.println((String)myCache.get("10"));System.out.println((String)myCache.get("11"));}}

    在此類中,我們啟動彈簧容器并加載spingaopdemo.xml中存在的bean。 我們在緩存中推送10個對象,當我們嘗試推送第11個對象時,第一個對象將被刪除并插入第11個對象。 輸出很大,所以我沒有發布輸出。 上課并檢查輸出是否令您滿意。

  • 摘要

    在這篇文章中,我們學習了如何使用面向方面的編程更好地處理交叉問題。 AOP是一個強大的概念,可讓我們編寫更簡潔,更解耦的代碼。 AOP不提供任何新內容。 它所做的只是將業務邏輯與系統必須執行的其他普通任務分離。 它可以重用實現系統范圍內交叉關注點的代碼。 我們還學習了與AOP相關的各種術語。 最后但并非最不重要的一點是,我們看到了一個簡單的示例,在該示例中,我們使用Spring AOP創建了一個簡單的方法前建議,并將其應用于管理緩存系統。

    注意

    您可以自由使用和分發此代碼中開發的緩存系統。 盡管不建議在生產系統中使用它。

    一如既往,我一直希望這篇文章作為集體學習的啟動平臺,隨意發表一兩個關于您對AOP的看法以及如何計劃在代碼中使用它的評論。 祝您閱讀愉快。

    參考: Weblog4j博客上的JCG合作伙伴 Niraj Singh的《 Spring面向方面的編程》 。

    翻譯自: https://www.javacodegeeks.com/2013/10/aspect-oriented-programming-with-spring-2.html

    spring 面向接口編程

    總結

    以上是生活随笔為你收集整理的spring 面向接口编程_Spring面向方面的编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。