一个简单的AOP框架

                      一个简单的AOP框架
  AOP非常的有趣,它可以帮助我们解决很多代码横向的很多问题,如果你不了解AOP.请参看相关的文章.
  现在介绍的一个AOP框架,来自CodeProject 作者Andrea Bioli.文章名称The simplest AOP scenario in C#
  现在我们来使用这个框架来演示一个AOP的强大.
  首先创建一个类,名位SimpleAOP.这个类必须继承AOPBaseClass.表示这个类要使用一个控制器来控制.代码如下
   class SimpleAop:AOPBaseClass
    {
        public void Output(string s)
        {
            Console.WriteLine(s);
        }
        public void Test1()
        {
            Output("Test1");
        }
        Public void Test2()
        {
   Output(“Test2”);
        }
  Public void NoMatcherMethod()
  {
   Output(“NoMatcherMethod”);
  }
}
前面提到了控制器.现在我们来创建自己的控制器类,这个类必须继承AOPBaseControler(这里著名,这里我改良过的)
   public class MyController : AOPBaseController
    {
        public void Output(string s)
        {
            Console.WriteLine(s);
        }
        public override void Begin(object o, System.Runtime.Remoting.Messaging.IMessage msg)
        {
            Output("begin");
        }
        public override void End(object o, System.Runtime.Remoting.Messaging.IMessage msg)
        {
            Output("end");
        }
        public override void Exception(object o, System.Runtime.Remoting.Messaging.IMessage msg)
        {
            Output("Exception");
        }
    }
这里覆盖了三个方法Begin,End和Exception表示在使用AOP的类的方法中我们可以添加这三个方法.
我们现在来看入口函数
AOPConfig.SetAssoc(typeof(SimpleAop), typeof(MyController), new RegExMethNameMatcher("Test"));
 SimpleAop aop = new SimpleAop();
 aop.Test1();
这里的第一行表示在SimpleAOP类和MyController之间的联合,那么通过什么来联合这两个类呢?RegExMethNameMatcher这个类可以用来查找SimpleAOP里面的方法那些可以使用MyController提供的方法.
上面的例子表明了,我们的Controller运用到了匹配Test的方法上.
代码的输出结果为
Begin
Test1
End
我们在SimpleAOP类Test1方法上添加一个throw new Exception(“TestException
“);来抛出一个异常.在运行刚才的代码.输出结果为
Begin
Test1
End
Exeption
这个说明了,当抛出异常的时候,调用控制器的Exception方法.

好了,我们回到入口函数.我们添加如下的代码
Aop.Test2();/
我们可以看到输出Test2()也运用了控制器.
如果添加
Aop. NoMatcherMethod();就可以看出来,这个函数因为和Matcher不匹配,所以没有运用控制器.
体会到AOP所带来的另外一种代码复用.

框架获得请查看CodeProject

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AOP(Aspect Oriented Programming)是一种面向切面编程的编程范式,它可以在程序运行时动态地将代码插入到指定方法的前面、后面或者中间,从而实现对方法的增强。 下面是手写一个简单AOP框架的步骤: 1. 定义注解 定义一个自定义注解,用于标注需要增强的方法。例如: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { } ``` 2. 定义切面 定义一个切面类,该类包含需要增强的方法以及增强逻辑。例如: ```java public class MyAspect { public void before() { System.out.println("before"); } public void after() { System.out.println("after"); } } ``` 3. 定义代理类 定义一个代理类,该类通过反射机制获取需要增强的方法以及切面类中的增强逻辑,并在方法执行前后调用切面类中的增强逻辑。例如: ```java public class MyProxy { public static Object getProxy(Object target) { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), (proxy, method, args) -> { Method targetMethod = target.getClass().getMethod(method.getName(), method.getParameterTypes()); if (targetMethod.isAnnotationPresent(MyAnnotation.class)) { MyAspect aspect = new MyAspect(); aspect.before(); Object result = method.invoke(target, args); aspect.after(); return result; } else { return method.invoke(target, args); } }); } } ``` 4. 使用代理类 通过代理类获取代理对象,并使用该对象调用需要增强的方法。例如: ```java public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); MyClass myProxy = (MyClass) MyProxy.getProxy(myClass); myProxy.method(); } } class MyClass { @MyAnnotation public void method() { System.out.println("method"); } } ``` 当调用代理对象的`method()`方法时,会先调用`MyAspect`中的`before()`方法,然后调用原始对象`MyClass`中的`method()`方法,最后再调用`MyAspect`中的`after()`方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值