MVC AOP面向切面编程简单介绍及实例

发布时间 - 2026-01-10 21:58:02    点击率:

MVC AOP面向切面编程

AOP这个词相信大家都没有接触太多过,但是实际上你们已经有所接触了,就在设计模式中。AOP所用的思想其实和设计模式是一样的,即在不修改原代码的情况下统一增加或者修改功能。还有,AOP大多用在spring里面,但是本文所写的只是在MVC中的应用,要注意。

一、简介

        所谓AOP(Aspect Oriented Programming的缩写)意为面向切面的编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

        以上是百度百科的官方解释,但是在我看来,其实AOP更多的是一种思想,一种可以动一发而通全身的思想,AOP其实面对的更多是一种同意的功能或者调用过程来进行编写的一种程序体,从它的第一个词Aspect(切面)也就是指的一个方面,也可以了解到这种方式也就是针对一个方面的实现,这一点其实和mvc中的global文件很像,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

        其次就是它的预编译性质可以很好的处理一些错误或者是预先判断一些情况,这也导致了它在设计的时候在判断权限,统一输出某个东西方面变得比较常见。“可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。”上面这句话也是对于AOP的很好的诠释。

二、在MVC中的实现

        说了这么多了,让我们来实战一下吧,首先我们需要在vs新建一个mvc的项目,选择MVC3或者是4都OK,然后建立一个controller,命名随意,然后建立他的视图,在视图上写上最简单的HelloWorld。

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

        右图是我创建好的MVC解决方案和添加好的controller还有view,在view中写入上面的代码以显示Hello!World。

         运行之后(不会运行的自行百度)是不是就显示出了一个HelloWorld的字样在网页上呢?

         好,接下来我们开始新建AOP的一个文件然后去使用,首先在本项目中新添加一个类,名字叫FilterPublic,在引用的地方添加using  System.Web.Mvc这个引用,然后让这个类继承于ActionFilterAttribute,大家要注意Action这个词,说明这个东西是基于动作的。

        然后我们写入以下代码:

public string Message { get; set; } 
 
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
  base.OnActionExecuting(filterContext); 
  filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />"); 
} 
 
public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
  base.OnActionExecuted(filterContext); 
  filterContext.HttpContext.Response.Write("Action执行之后" + 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 />"); 
} 

        这个里面就是Filter触发的各种动作,然后我们在controller里面的默认方法做以下修改:

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

然后在controller的class类上面也添加一句[FilterPublic(Message = "Controller")],然后运行,会出现什么结果呢?

Action执行之前Action 
Action正在执行··· 
Action执行之后Action 
返回Result之前Action 
正在返回Result··· 
返回Result之后Action 

        可以看到controller里面的方法在执行之前会去先执行以下我们设置的FilterPublic里面的代码,而且随着里面动作发生时间不同也可以看出了都是哪个方法被触发了。 

       但是在controller上面写的基于controller的方法却没有触发,这是为什么呢?

         其实这个问题很简单,就是我们在设置我们的AOP程序的时候没有进行参数的设置,没有让filter进行叠加的运行,这个时候我们只要在写的FilterPublic类的上面加上:[AttributeUsage(AttributeTargets.All, AllowMultiple = true)],就可以让你设置的各种filter或者叠加的filter进行触发了,这个时候我们再运行一下试试:

Action执行之前Controller 
Action执行之前Action 
Action正在执行··· 
Action执行之后Action 
Action执行之后Controller 
 
返回Result之前Controller 
返回Result之前Action 
正在返回Result··· 
返回Result之后Action 
返回Result之后Controller 

       这样一来,在controller上的Filter也被触发了,所以我们使用AOP的方法只需要在我们自己的写的方法或者页面默认的加载方法上面写上一个filter类的标签就可以了。

       那么,如果我们有个功能需要所有的页面都触发,这样岂不是也很麻烦么?别担心,这个时候就轮到我们的global文件发挥作用了。在global.asax文件下面的RegisterGlobalFilters方法下面注册自己写的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/>" }); 
 
} 

然后运行,看结果:

Action执行之前全局 
 
Action执行之前Controller 
Action执行之前Action 
Action正在执行··· 
Action执行之后Action 
Action执行之后Controller 
Action执行之后全局 
 
返回Result之前全局 
 
返回Result之前Controller 
返回Result之前Action 
正在返回Result··· 
返回Result之后Action 
返回Result之后Controller 
返回Result之后全局 

这样全局的触发也就做好了(filter中的message只是用于标识层级的,正式用的时候可以不用定义。)

        这样一看,如果想要快速的添加一个全局都用的方法,只需要新建一个Filter,然后再改一下global文件就可以办到了,是不是很方便呢。

    以上均为本人对于AOP的一些浅浅的研究,如有错误的地方还请读者指正。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# MVC  # AOP面向切面编程  # AOP面向切面编程详细介绍  # AOP面向切面编程简单实例  # Java实现AOP面向切面编程的实例教程  # Spring AOP面向切面编程实现原理方法详解  # Spring 面向切面编程AOP实现详解  # 面向切面编程(AOP)的理解  # java开发AOP面向切面编程入门  # 就可以  # 自己的  # 这个时候  # 的是  # 很好  # 也就  # 要注意  # 或者是  # 以对  # 写上  # 重要内容  # 新建一个  # 各部分  # 都是  # 这是  # 情况下  # 提高了  # 是一种  # 让你  # 就在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何快速上传自定义模板至建站之星?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何快速完成中国万网建站详细流程?  如何在云虚拟主机上快速搭建个人网站?  php json中文编码为null的解决办法  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel如何自定义错误页面(404, 500)?(代码示例)  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel怎么在Controller之外的地方验证数据  Swift中switch语句区间和元组模式匹配  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  装修招标网站设计制作流程,装修招标流程?  如何有效防御Web建站篡改攻击?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  如何基于云服务器快速搭建网站及云盘系统?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何基于云服务器快速搭建个人网站?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何打造高效商业网站?建站目的决定转化率  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  香港服务器租用费用高吗?如何避免常见误区?  EditPlus中的正则表达式 实战(2)  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何快速生成高效建站系统源代码?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  C++时间戳转换成日期时间的步骤和示例代码  黑客如何通过漏洞一步步攻陷网站服务器?  ,交易猫的商品怎么发布到网站上去?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  手机软键盘弹出时影响布局的解决方法  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何快速查询网址的建站时间与历史轨迹?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何快速生成可下载的建站源码工具?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  详解vue.js组件化开发实践  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?