亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MVC AOP面向切面編程簡(jiǎn)單介紹及實(shí)例

 更新時(shí)間:2016年12月20日 14:53:00   投稿:lqh  
這篇文章主要介紹了MVC AOP面向切面編程簡(jiǎn)單介紹及實(shí)例的相關(guān)資料,需要的朋友可以參考下

MVC AOP面向切面編程

AOP這個(gè)詞相信大家都沒(méi)有接觸太多過(guò),但是實(shí)際上你們已經(jīng)有所接觸了,就在設(shè)計(jì)模式中。AOP所用的思想其實(shí)和設(shè)計(jì)模式是一樣的,即在不修改原代碼的情況下統(tǒng)一增加或者修改功能。還有,AOP大多用在spring里面,但是本文所寫(xiě)的只是在MVC中的應(yīng)用,要注意。

一、簡(jiǎn)介

        所謂AOP(Aspect Oriented Programming的縮寫(xiě))意為面向切面的編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。

        以上是百度百科的官方解釋?zhuān)窃谖铱磥?lái),其實(shí)AOP更多的是一種思想,一種可以動(dòng)一發(fā)而通全身的思想,AOP其實(shí)面對(duì)的更多是一種同意的功能或者調(diào)用過(guò)程來(lái)進(jìn)行編寫(xiě)的一種程序體,從它的第一個(gè)詞Aspect(切面)也就是指的一個(gè)方面,也可以了解到這種方式也就是針對(duì)一個(gè)方面的實(shí)現(xiàn),這一點(diǎn)其實(shí)和mvc中的global文件很像,也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。

        其次就是它的預(yù)編譯性質(zhì)可以很好的處理一些錯(cuò)誤或者是預(yù)先判斷一些情況,這也導(dǎo)致了它在設(shè)計(jì)的時(shí)候在判斷權(quán)限,統(tǒng)一輸出某個(gè)東西方面變得比較常見(jiàn)?!翱梢酝ㄟ^(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加功能的一種技術(shù)。AOP實(shí)際是GoF設(shè)計(jì)模式的延續(xù),設(shè)計(jì)模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,提高代碼的靈活性和可擴(kuò)展性,AOP可以說(shuō)也是這種目標(biāo)的一種實(shí)現(xiàn)?!鄙厦孢@句話(huà)也是對(duì)于AOP的很好的詮釋。

二、在MVC中的實(shí)現(xiàn)

        說(shuō)了這么多了,讓我們來(lái)實(shí)戰(zhàn)一下吧,首先我們需要在vs新建一個(gè)mvc的項(xiàng)目,選擇MVC3或者是4都OK,然后建立一個(gè)controller,命名隨意,然后建立他的視圖,在視圖上寫(xiě)上最簡(jiǎn)單的HelloWorld。

<!DOCTYPE html> 
 
<html> 
<head> 
  <title>Index</title> 
</head> 
<body> 
  <div> 
    <a>Hello! World</a> 
  </div> 
</body> 
</html> 

        右圖是我創(chuàng)建好的MVC解決方案和添加好的controller還有view,在view中寫(xiě)入上面的代碼以顯示Hello!World。

         運(yùn)行之后(不會(huì)運(yùn)行的自行百度)是不是就顯示出了一個(gè)HelloWorld的字樣在網(wǎng)頁(yè)上呢?

         好,接下來(lái)我們開(kāi)始新建AOP的一個(gè)文件然后去使用,首先在本項(xiàng)目中新添加一個(gè)類(lèi),名字叫FilterPublic,在引用的地方添加using  System.Web.Mvc這個(gè)引用,然后讓這個(gè)類(lèi)繼承于ActionFilterAttribute,大家要注意Action這個(gè)詞,說(shuō)明這個(gè)東西是基于動(dòng)作的。

        然后我們寫(xiě)入以下代碼:

public string Message { get; set; } 
 
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
  base.OnActionExecuting(filterContext); 
  filterContext.HttpContext.Response.Write("Action執(zhí)行之前" + Message + "<br />"); 
} 
 
public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
  base.OnActionExecuted(filterContext); 
  filterContext.HttpContext.Response.Write("Action執(zhí)行之后" + Message + "<br />"); 
} 
 
public override void OnResultExecuting(ResultExecutingContext filterContext) 
{ 
  base.OnResultExecuting(filterContext); 
  filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />"); 
} 
 
public override void OnResultExecuted(ResultExecutedContext filterContext) 
{ 
  base.OnResultExecuted(filterContext); 
  filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />"); 
} 

        這個(gè)里面就是Filter觸發(fā)的各種動(dòng)作,然后我們?cè)赾ontroller里面的默認(rèn)方法做以下修改:

[<span style="font-size:18px;">FilterPublic</span>(Message = "Action")] 
public ActionResult Index() 
{ 
  HttpContext.Response.Write("Action正在執(zhí)行···<br />"); 
  return Content("正在返回Result···<br />"); 
} 

然后在controller的class類(lèi)上面也添加一句[FilterPublic(Message = "Controller")],然后運(yùn)行,會(huì)出現(xiàn)什么結(jié)果呢?

Action執(zhí)行之前Action 
Action正在執(zhí)行··· 
Action執(zhí)行之后Action 
返回Result之前Action 
正在返回Result··· 
返回Result之后Action 

        可以看到controller里面的方法在執(zhí)行之前會(huì)去先執(zhí)行以下我們?cè)O(shè)置的FilterPublic里面的代碼,而且隨著里面動(dòng)作發(fā)生時(shí)間不同也可以看出了都是哪個(gè)方法被觸發(fā)了。 

       但是在controller上面寫(xiě)的基于controller的方法卻沒(méi)有觸發(fā),這是為什么呢?

         其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,就是我們?cè)谠O(shè)置我們的AOP程序的時(shí)候沒(méi)有進(jìn)行參數(shù)的設(shè)置,沒(méi)有讓filter進(jìn)行疊加的運(yùn)行,這個(gè)時(shí)候我們只要在寫(xiě)的FilterPublic類(lèi)的上面加上:[AttributeUsage(AttributeTargets.All, AllowMultiple = true)],就可以讓你設(shè)置的各種filter或者疊加的filter進(jìn)行觸發(fā)了,這個(gè)時(shí)候我們?cè)龠\(yùn)行一下試試:

Action執(zhí)行之前Controller 
Action執(zhí)行之前Action 
Action正在執(zhí)行··· 
Action執(zhí)行之后Action 
Action執(zhí)行之后Controller 
 
返回Result之前Controller 
返回Result之前Action 
正在返回Result··· 
返回Result之后Action 
返回Result之后Controller 

       這樣一來(lái),在controller上的Filter也被觸發(fā)了,所以我們使用AOP的方法只需要在我們自己的寫(xiě)的方法或者頁(yè)面默認(rèn)的加載方法上面寫(xiě)上一個(gè)filter類(lèi)的標(biāo)簽就可以了。

       那么,如果我們有個(gè)功能需要所有的頁(yè)面都觸發(fā),這樣豈不是也很麻煩么?別擔(dān)心,這個(gè)時(shí)候就輪到我們的global文件發(fā)揮作用了。在global.asax文件下面的RegisterGlobalFilters方法下面注冊(cè)自己寫(xiě)的Filter就可以了:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
  filters.Add(new HandleErrorAttribute()); 
  //把自己的filter定義成全局的filter 
  filters.Add(new <span style="font-size:18px;">FilterPublic</span>() { Message = "全局<br/>" }); 
 
} 

然后運(yùn)行,看結(jié)果:

Action執(zhí)行之前全局 
 
Action執(zhí)行之前Controller 
Action執(zhí)行之前Action 
Action正在執(zhí)行··· 
Action執(zhí)行之后Action 
Action執(zhí)行之后Controller 
Action執(zhí)行之后全局 
 
返回Result之前全局 
 
返回Result之前Controller 
返回Result之前Action 
正在返回Result··· 
返回Result之后Action 
返回Result之后Controller 
返回Result之后全局 

這樣全局的觸發(fā)也就做好了(filter中的message只是用于標(biāo)識(shí)層級(jí)的,正式用的時(shí)候可以不用定義。)

        這樣一看,如果想要快速的添加一個(gè)全局都用的方法,只需要新建一個(gè)Filter,然后再改一下global文件就可以辦到了,是不是很方便呢。

    以上均為本人對(duì)于AOP的一些淺淺的研究,如有錯(cuò)誤的地方還請(qǐng)讀者指正。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • IDEA報(bào)錯(cuò):java:無(wú)效的源發(fā)行版21解決方式

    IDEA報(bào)錯(cuò):java:無(wú)效的源發(fā)行版21解決方式

    這篇文章主要給大家介紹了關(guān)于IDEA報(bào)錯(cuò):java:無(wú)效的源發(fā)行版21的解決方式,這個(gè)錯(cuò)誤是因?yàn)槟愕捻?xiàng)目使用的Java版本與你的IDEA使用的Java版本不一致導(dǎo)致的,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Java詳細(xì)講解Math和Random類(lèi)中有哪些常用方法

    Java詳細(xì)講解Math和Random類(lèi)中有哪些常用方法

    Math類(lèi)位于java.lang包中,包含很多用于科學(xué)計(jì)算的類(lèi)方法,這些方法可以直接通過(guò)類(lèi)名調(diào)用。Random類(lèi)獲取隨機(jī)數(shù),位于java.util包中,本篇帶你了解它們的常用方法
    2022-05-05
  • 淺談JAVA 類(lèi)加載器

    淺談JAVA 類(lèi)加載器

    這篇文章主要介紹了JAVA 類(lèi)加載器的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • SpringMVC Controller 返回值的可選類(lèi)型詳解

    SpringMVC Controller 返回值的可選類(lèi)型詳解

    本篇文章主要介紹了SpringMVC Controller 返回值的可選類(lèi)型詳解 ,spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void,有興趣的可以了解一下
    2017-05-05
  • 基于Java編寫(xiě)一個(gè)限流工具類(lèi)RateLimiter

    基于Java編寫(xiě)一個(gè)限流工具類(lèi)RateLimiter

    這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)一個(gè)限流工具類(lèi)RateLimiter,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Java算法實(shí)現(xiàn)楊輝三角的講解

    Java算法實(shí)現(xiàn)楊輝三角的講解

    今天小編就為大家分享一篇關(guān)于Java算法實(shí)現(xiàn)楊輝三角的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Shiro與Springboot整合開(kāi)發(fā)的基本步驟過(guò)程詳解

    Shiro與Springboot整合開(kāi)發(fā)的基本步驟過(guò)程詳解

    這篇文章主要介紹了Shiro與Springboot整合開(kāi)發(fā)的基本步驟,本文結(jié)合實(shí)例代碼給大家介紹整合過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • mybatis-plus使用問(wèn)題小結(jié)

    mybatis-plus使用問(wèn)題小結(jié)

    這篇文章主要介紹了mybatis-plus使用問(wèn)題匯總,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Java Servlet 運(yùn)行原理分析

    Java Servlet 運(yùn)行原理分析

    這篇文章主要介紹了Java Servlet 運(yùn)行原理分析,幫助大家更好的理解和學(xué)習(xí)Java Servlet的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-11-11
  • 老程序員教你一天時(shí)間完成Java迷宮小游戲

    老程序員教你一天時(shí)間完成Java迷宮小游戲

    最近經(jīng)常在機(jī)房看同學(xué)在玩一個(gè)走迷宮的游戲,比較有趣,自己也用java寫(xiě)一個(gè)實(shí)現(xiàn)隨機(jī)生成迷宮的算法,其實(shí)就是一個(gè)圖的深度優(yōu)先遍歷算法.
    2021-08-08

最新評(píng)論