也说AOP
前言
1.引言
2.Aop概念
3.Aop实践
4.总结
一、引言
对于初入行的小白来讲,aop,ioc这两个程序设计思想总是傻傻分不清,不知道是个什么东东?别人再一谈各种框架更是云里雾里。。。博主今天带大家且先入个门,哈哈;)
二、Aop概念
AOP为Aspect Oriented Programming的缩写,译为:面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
三、Aop实践
在开发中,相信大家都遇到过验证用户权限的事情,那是不是需要在每个界面上都要加个判断呢?假如通过验证,就执行某某业务逻辑,不通过,就跳转或者提示啊 怎么怎么样。。。
示图一
从程序设计的角度来考虑,验证用户 这件事情我们是不是可以分离出去呢,因为都是相同的嘛,减少重复,也是在不修改源代码的情况下动态统一添加功能;另一个方面可以 让一个对象尽可能的多关注自己的业务逻辑。这对于建立一个松耦合、可复用、可扩展性的系统是非常有利的。
下面介绍静态代理和动态代理实现AOP。(IL编织实现AOP这篇暂时先不介绍。。。)
创建公用的Model类
public class User
{
public int Age { get; set; }
public string Name { get; set; }
}
代理模式 实现静态代理
//代理模式 实现静态代理
class DecoratorAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
IUserProcesser processer = new UserProcesser();
processer.RegUser(user);
IUserProcesser userProcesser = new UserProcesserDecorator(processer);
userProcesser.RegUser(user);
}
public interface IUserProcesser
{
void RegUser(User user);
}
public class UserProcesser : IUserProcesser
{
public void RegUser(User user)
{
Console.WriteLine($"注册用户,年龄为{user.Age},姓名{user.Name}");
}
}
public class UserProcesserDecorator : IUserProcesser
{
public IUserProcesser userProcesser; public UserProcesserDecorator(IUserProcesser processer)
{
userProcesser = processer;
}
public void RegUser(User user)
{
BeforeProcess();
Console.WriteLine($"注册用户,年龄为{user.Age},姓名{user.Name}");
AfterProcess();
}
public void BeforeProcess()
{
Console.WriteLine("方法执行前");
}
public void AfterProcess()
{
Console.WriteLine("方法执行后");
}
} }
class Program
{
static void Main(string[] args)
{
DecoratorAop.Show();
Console.ReadLine();
}
}
使用.NET Remoting/RealProxy 实现动态代理
class ProxyAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
UserProcessor userProcessor = TransparentProxy.Create<UserProcessor>();
userProcessor.RegUser(user); }
/// <summary>
/// 真实代理
/// </summary>
/// <typeparam name="T"></typeparam>
public class MyRealProxy<T> : RealProxy
{
private T tTarget;
public MyRealProxy(T target)
:base(typeof(T))
{
tTarget = target;
} public override IMessage Invoke(IMessage msg)
{
BeforeProcess();
IMethodCallMessage methodCallMessage = (IMethodCallMessage)msg;
object returnValue= methodCallMessage.MethodBase.Invoke(this.tTarget, methodCallMessage.Args);
AfterProcess();
return new ReturnMessage(returnValue,new object[],,null, methodCallMessage);
}
public void BeforeProcess()
{
Console.WriteLine("方法执行前");
}
public void AfterProcess()
{
Console.WriteLine("方法执行后");
}
}
/// <summary>
/// 透明代理
/// </summary>
public static class TransparentProxy
{
public static T Create<T>()
{
T instance= Activator.CreateInstance<T>();
MyRealProxy<T> myRealProxy = new MyRealProxy<T>(instance);
T transparentProxy= (T)myRealProxy.GetTransparentProxy();
return transparentProxy;
}
}
public interface IUserProcessor
{
void RegUser(User user);
}
public class UserProcessor :MarshalByRefObject, IUserProcessor
{
public void RegUser(User user)
{
Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
}
} }
class Program
{
static void Main(string[] args)
{
ProxyAop.Show();
Console.ReadLine();
}
}
使用Castle\DynamicProxy 实现动态代理
public class CastleProxyAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
ProxyGenerator proxyGenerator = new ProxyGenerator();
MyInterceptor myInterceptor = new MyInterceptor();
UserProcessor userProcessor= proxyGenerator.CreateClassProxy<UserProcessor>(myInterceptor);
userProcessor.RegUser(user);
userProcessor.GetID();
}
public interface IUserProcessor
{
void RegUser(User user);
void GetID();
}
public class UserProcessor : IUserProcessor
{
public virtual void RegUser(User user)
{
Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
}
public virtual void GetID()
{
Console.WriteLine($"这是1");
}
}
public class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
PreProceed();
invocation.Proceed();
PostProceed();
}
public void PreProceed()
{
Console.WriteLine($"方法执行前");
}
public void PostProceed()
{
Console.WriteLine($"方法执行后");
}
} }
class Program
{
static void Main(string[] args)
{
CastleProxyAop.Show();
Console.ReadLine();
}
}
使用Entlib\PLAB Unity实现动态代理
public class UnityAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
IUnityContainer unityContainer = new UnityContainer(); //声明一个容器
unityContainer.RegisterType<IUserProcessor, UserProcessor>(); //声明unityContainer并注册IUserProcessor unityContainer.AddNewExtension<Interception>().Configure<Interception>()
.SetInterceptorFor<IUserProcessor>(new InterfaceInterceptor());
IUserProcessor userProcessor = unityContainer.Resolve<IUserProcessor>();
userProcessor.RegUser(user);
} #region //特性对应的行为
public class UserHandler : ICallHandler
{
public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{ User user = input.Inputs[] as User;
if(user.Age<)
{
return input.CreateExceptionMethodReturn(new Exception("年龄小于1岁禁止入内"));
}
Console.WriteLine($"参数检测无误");
IMethodReturn methodReturn = getNext()(input, getNext);
return methodReturn;
}
} public class LogHandler : ICallHandler
{
public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{ User user = input.Inputs[] as User;
string message = $"年龄{user.Age},姓名{user.Name}";
Console.WriteLine($"日志已记录,message:{message},time:{DateTime.Now}");
return getNext()(input, getNext);
}
} public class ExceptionHandler : ICallHandler
{
public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
IMethodReturn methodReturn = getNext()(input, getNext);
if(methodReturn.Exception==null)
{
Console.WriteLine("无异常");
}
else
{
Console.WriteLine($"异常:{methodReturn.Exception.Message}");
}
return methodReturn;
}
}
#endregion #region //特性
public class UserHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
ICallHandler callHandler = new UserHandler { Order = this.Order };
return callHandler;
}
}
public class LogHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new LogHandler { Order = this.Order };
}
}
public class ExceptionHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
ICallHandler callHandler = new ExceptionHandler { Order = this.Order };
return callHandler;
}
}
#endregion #region //业务
[ExceptionHandlerAttribute(Order =)]
[LogHandlerAttribute(Order =)]
[UserHandlerAttribute(Order =)]
public interface IUserProcessor
{
void RegUser(User user);
}
public class UserProcessor : IUserProcessor
{
public void RegUser(User user)
{
Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
}
}
#endregion
}
class Program
{
static void Main(string[] args)
{
UnityAop.Show();
Console.ReadLine();
}
}
四、总结
AOP的优点:
1.解耦,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑中分离出去,当这些行为改变时不影响业务逻辑。
2.将通用功能从业务逻辑中抽离出来,提高代码复用性,灵活性,可扩展性。
AOP与OOP的区别:
OOP讲究“一切皆为对象”,使用类将世间万事万物的状态和行为模块化,封装继承多态。
AOP是将切面(Aspect)模块化。纵向切入,对业务处理过程中的切面进行提取,以获得逻辑过程中各部分之间低耦合的隔离效果,使应用对象更加关注业务逻辑,实现解耦,提供程序灵活性及可扩展性。
适用场景:日志记录,性能统计,安全控制,事务处理,异常处理。
参考:
http://www.cnblogs.com/landeanfen/p/4782370.html
http://www.cnblogs.com/jin-yuan/p/3811077.html
http://wayfarer.cnblogs.com/articles/241024.html
也说AOP的更多相关文章
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- 学习AOP之深入一点Spring Aop
上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...
- 学习AOP之认识一下Spring AOP
心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- .NET里简易实现AOP
.NET里简易实现AOP 前言 在MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现了吧,时常在工作学习中遇到AOP对于它的运用可以说是很熟练了,就是没想过如果自己来实现的话是怎么实现的,性子比 ...
- 在.Net中实现自己的简易AOP
RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...
- 使用Java原生代理实现AOP
### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...
- 【开源】.Net Aop(静态织入)框架 BSF.Aop
BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...
随机推荐
- mysql utf8方式连接查看表数据乱码的问题
起因 今天在公司第一次链接一个新的mysql数据库,我看到在spring里配置的jdbc里datasource.url里有配置characterEncoding=utf8..然后就用navicat开选 ...
- 【转】SVN 与 GIT 详细对比
git和svn的详细对比 近期就[版本管理工具是否进行切换SVN->Git]的问题进行了讨论,于是对svn和Git进行了相关研究,进而梳理出Git的特点(优.缺点),最后将Git与SVN进行 ...
- Javascript 键盘事件
window.document.onkeydown = function (e) { var evt = window.event || e;//兼容性处理 var keycode = evt.key ...
- 封装basedao
package com.huawei.common; import java.sql.ResultSet;import java.sql.SQLException; public interface ...
- 基于mapper插件编写的可定制代码生成基本框架(springboot)
先看一下,基本结构图: 特征,提供 最佳实践的项目结构.配置文件.精简的POM 统一响应结果封装 统一异常处理 统一接口登录认证 常用基础方法抽象封装 Controller.service.dao层基 ...
- 使用CocoaPods卡在了"pod setup"界面的解决办法
http://blog.csdn.net/samoy/article/details/51956799 有时候,我们在执行pod install或pod search命令时,会在终端偶现卡在’ ...
- jdk8中的StreamAPI
1.实体类 package com.zy.model; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.D ...
- Spring boot 开发组件
一.Jboot 描述:Jboot是一个基于jfinal 和 undertow开发的微服务框架.提供了AOP.RPC.分布式缓存.限流.降级.熔断.统一配置中心.swagger api自动生成.Open ...
- js正则表达式语法[转]
1. 正则表达式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的 ...
- LinqPad介绍,下载,用法说明
介绍一款用于Linq运算和测试的工具,LinqPad.我感觉这个工具非常优秀,不只是功能上优秀,在使用上也非常优秀,让我爱不释手. LinqPad官方地址:http://www.linqpad.net ...