Aspect Oriented Programming面向切面编程
I简介
Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是权限验证,日志记录。
举个例子,我们现在提供例了获取数据的一个方法,但是我们希望并不是所有人都有权限调用。如果按照传统的OOP的实现的话,我们实现了获取数据获取数据,同时为了要进行权限验证的的话,那我们在实现该方法中要添加验证权限的代码。这样的话,假如我们要实现的功能有多个呢?那就要在每个实现的类都添加这些验证权限的代码。这样做的话就会有点繁琐,而且每个实现类都与验证权限的行为紧耦合,违反了面向对象的规则。那么怎样才能把验证权限的行为与业务处理过程中分离出来呢?看起来好像就是获取数据的方法自己在进行,但却是背后权限验证为这些行为进行验证,并且方法调用者都不知道存在这些权限验证过程,这就是我们要讨论AOP的目的所在。AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行隔离,这样与一批对象之间降低了耦合性,可以就某个功能进行编程。
II代码实现:
1. 类标签声明
/// <summary> /// 支持权限验证标签 /// </summary> [AttributeUsage(AttributeTargets.Class)] public class PermissionCheckAttribute :ContextAttribute { public PermissionCheckAttribute() : base("PermissionCheck") { } public override voidGetPropertiesForNewContext(IConstructionCallMessage ccm) { ccm.ContextProperties.Add(newPermissionCheckProperty()); } }
2. 验证属性声明
public class PermissionCheckProperty :IContextProperty, IContributeObjectSink { #region IContributeObjectSinkimplementation public IMessageSinkGetObjectSink(MarshalByRefObject o, IMessageSink next) { return new SecurityAspect(next); } #endregion // IContributeObjectSinkimplementation #region IContextProperty implementation // Implement Name, Freeze,IsNewContextOK public string Name { get { return"PermissionCheckProperty"; } } public void Freeze(Context newContext) { } public bool IsNewContextOK(ContextnewCtx) { return true; } #endregion //IContextPropertyimplementation }
3. 验证属性上下文声明
public class PermissionCheckProperty :IContextProperty, IContributeObjectSink { #region IContributeObjectSinkimplementation public IMessageSinkGetObjectSink(MarshalByRefObject o, IMessageSink next) { return new SecurityAspect(next); } #endregion // IContributeObjectSinkimplementation #region IContextProperty implementation // Implement Name, Freeze,IsNewContextOK public string Name { get { return"PermissionCheckProperty"; } } public void Freeze(Context newContext) { } public bool IsNewContextOK(ContextnewCtx) { return true; } #endregion //IContextProperty implementation }
4. 函数标签声明
/// <summary> /// 功能描述标签类 /// </summary> [AttributeUsage(AttributeTargets.All,AllowMultiple = false, Inherited = true)] public class FeatureDescriptionAttribute :Attribute { /// <summary> /// 功能编号 /// </summary> public string Guid { get; set; } /// <summary> /// 功能描述 /// </summary> public string Description { get; set; } public FeatureDescriptionAttribute() {} public FeatureDescriptionAttribute(stringname, string description) { this.Guid = name; this.Description = description; } }
5.验证实现具体帮助类
/// <summary> /// 权限验证帮助类 /// </summary> public class PowerHelper { /// <summary> /// 权限验证方法实现 /// </summary> /// <param name="guid">功能编号</param> /// <paramname="description">功能描述</param> public static voidPermissionCheck(string guid, string description) { //TODO:此处查询数据库,做权限验证 if (guid =="04C4DFC7-9EDD-4A5D-9029-3EDCD5977163") { //拥有权限,正常 MessageBox.Show("权限检测通过"); } else { //没有权限 throw newUnauthorizedAccessException("访问被拒绝,当前用户不具有操作此功能的权限!"); } } }
III具体使用例子
1. 功能函数声明
[PermissionCheck] public class ControlDemoApi :ContextBoundObject { [FeatureDescription("04C4DFC7-9EDD-4A5D-9029-3EDCD5977163","功能1")] public void Function1() { MessageBox.Show("成功的执行了功能1!"); } [FeatureDescription("2FCFA71B-D492-4F88-8A75-985AC70BA161","功能2")] public void Function2() { MessageBox.Show("成功的执行了功能2!"); } }
2.调用功能函数
ControlDemoApi apiDemo =new ControlDemoApi(); apiDemo.Function1(); apiDemo. Function2();
3.说明
如2中描述,在执行apiDemo. Function1();之前会自动调用验证实现具体帮助类中的PermissionCheck(string guid, string description)方法。执行结果为 首先弹出消息权限检测通过,然后弹出消息 成功的执行了功能1!
如2中描述,在执行apiDemo. Function2 ();之前会自动调用验证实现具体帮助类中的PermissionCheck(stringguid, string description)方法。执行结果为 访问被拒绝,抛出异常 当前用户不具有操作此功能的权限!
Aspect Oriented Programming面向切面编程的更多相关文章
- Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)
三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Progra ...
- Aspect Oriented Programming
AOP(Aspect Oriented Programming),面向切面编程(也叫面向方面)是目前软件开发中的一个热点.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度 ...
- Java笔记——面向切面编程(AOP模式)
原文:http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming 面向切面 ...
- Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式
1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动 ...
- Spring AOP(面向切面编程)
一.AOP简介 1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学 ...
- Spring AOP 面向切面编程相关注解
Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. ...
- Spring详解篇之 AOP面向切面编程
一.概述 Aop(aspect oriented programming面向切面编程),是spring框架的另一个特征.AOP包括切面.连接点.通知(advice).切入点(pointCut) . 1 ...
- AOP面向切面编程笔记
1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学计算器接口[Ma ...
- java aop面向切面编程
最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblog ...
随机推荐
- jquery-6 jquery属性选择器
jquery-6 jquery属性选择器 一.总结 一句话总结:jquery操作就是选择器加jquery对象的各种方法. 1.大量操作样式用什么方式? 大批量样式通过加类和减类完成 2.jquery中 ...
- js进阶正则表达式6转义字符(加\转义)(.符号)(|符号)
js进阶正则表达式6转义字符(加\转义)(.符号)(|符号) 一.总结 转义字符:{} () / $ # & * . ....... //3.特殊字符,都要加转义\ 点符号:var reg2= ...
- VMWare提供三种工作模式桥接(bridge)、NAT(网络地址转换)和host-only(主机模式)
1.桥接模式 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地位),它可以访问网内任何一台机器.在桥接模式下,我们往往需要为虚拟主机配置IP地址.子网 ...
- android jni与java之间数据传输时怎么转换
1.c中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*. Java 类型 本地c类型 说明 boolean jboolean 无符号 8 位 b ...
- 定义变量let,const
1.块级作用域let 声明变量,作用域是最近的"{}": 'use strict'; { let test = '1'; } console.log(test);//test is ...
- [Django] Building the rest API
Install the rest api framework: pip install djangorestfamework In settings.py: INSTALLED_APPS = [ 'd ...
- 数字图像处理原理与实践(MATLAB版)勘误表
本文系<数字图像处理原理与实践(MATLAB版)>一书的勘误表. [内容简单介绍]本书全面系统地介绍了数字图像处理技术的理论与方法,内容涉及几何变换.灰度变换.图像增强.图像切割.图像去噪 ...
- html5--6-33 CSS定位是什么
html5--6-33 CSS定位是什么 一.总结 一句话总结: 1.常规文档流是一套体系,浮动是另外一套体系. 2.标签清除浮动之后会跑到常规文档流它本来的地方. 3.浮动是否占据常规文档流:应该不 ...
- System.getProperty()获取系统的配置信息(系统变量)
原文地址:http://www.jsjtt.com/java/Javajichu/105.html 此处记录备用. 1. 通过System.getProperty()可以获取系统的配置信息,Syste ...
- ts demuxer的加入记录
文件夹 1 初衷 2 ts demux的功能介绍 1 初衷 之前打算给dtplayer加入一些亮点功能,最初的想法是:bt下载播放 + hls支持 bt下载因为以来libtorrent库,尽管搞懂了怎 ...