深入浅出AOP

Posted gcczhongduan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出AOP相关的知识,希望对你有一定的参考价值。

动态代理实现AOP:


AOP事实上非常早之前依照做出来了一些东西,之所以不敢说做出来了。是由于它是什么?怎么实现?做出来的东西是不是?先前一直查资料。查到的资料跟着做。到后来发现,AOP越来越大,而非常多资料跟AOP本身的思想有冲突的地方,所以还有非常多要学习的地方。


AOP的作用:


能够动态的加入和删除在切面上的漏记而不影响原来的运行代码。


AOP代理实现:


静态代理实现:


用图说明一下下:


技术分享


接口实体类:


<span style="font-size:18px;">    namespace AOP_Test1  
    {  
        //实体类  
        public class User  
        {  
            public int id { get; set; }  
            public String name { get; set; }  
            public String password { get; set; }  
            //重写方法  
            public override string ToString()  
            {  
                return "id:" + id + ";name:" + name + ";password:" + password;  
            }  
        }  
    }  </span>

接口类:


<span style="font-size:18px;">namespace AOP_Test1  
{  
    //接口,数据操作  
    public interface IUser  
    {  
        void delete(User user);  
        void update(User user);  
    }  
} </span>


真正的实现类:


<span style="font-size:18px;">using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace AOP_Test1  
{  
    //IUser接口实现  
    public class IUserImpl:IUser  
    {  
        public void delete(User user) {  
            System.Console.WriteLine("删除用户");  
        }  
        public void update(User user) {  
            System.Console.WriteLine("更新用户");  
        }  
    }  
} </span>

静态代理类:


<span style="font-size:18px;">    namespace AOP_Test1  
    {  
        //IUser装饰类  
        public class IUserDecorator : IUser  
        {  
            public IUser iuser { get; set; }  
            public IUserDecorator(IUserImpl iUserImpl)  
            {  
                iuser = iUserImpl;  
            }  
      
            //删除  
            public void delete(User user)  
            {  
                beforeDelete(user);  
                iuser.delete(user);  
                afterDelete();  
      
            }  
            protected void beforeDelete(User user)  
            {  
      
                Console.WriteLine(DateTime.Now + ":删除之前进行数据备份:");  
                Console.WriteLine("备份数据:" + user.ToString());  
            }  
            protected void afterDelete()  
            {  
                Console.WriteLine("删除操作完毕.");  
            }  
      
            //更新  
            public void update(User user)  
            {  
                beforeUpdate(user);  
                user.name = "TanWeijie";  
                iuser.update(user);  
                afterUpdate(user);  
            }  
      
            protected void beforeUpdate(User user)  
            {  
      
                Console.WriteLine(DateTime.Now + ":更新之前进行数据备份:");  
                Console.WriteLine("更新前数据:" + user.ToString());  
            }  
            protected void afterUpdate(User user)  
            {  
                Console.WriteLine("更新操作完毕.");  
                Console.WriteLine("更新后数据:" + user.ToString());  
            }  
        }  
    }  </span>


执行时:


<span style="font-size:18px;">        static void Main(string[] args)  
        {  
            User user = new User();  
            user.id = 1;  
            user.name = "Tan";  
            user.password = "123456";  
  
            IUser iuser = new IUserDecorator(new IUserImpl());  
            iuser.delete(user);  
            Console.WriteLine();  
            iuser.update(user);  
        }  </span>

在上面我们能够看到。这是AOP的一个初步的模型,或者说这个不是真正意义上的AOP。


总结


上面的代码AOP是这样实现的:


技术分享



而事实上最简单的AOP是这种:


技术分享


未完待续。

。。。





































以上是关于深入浅出AOP的主要内容,如果未能解决你的问题,请参考以下文章

Spring框架深入--AOP面向切面

深入理解AOP-代理的秘密

技术分享4期Spring AOP 深入剖析

Spring AOP深入理解之拦截器调用

Spring框架系列 - 深入浅出Spring核心之面向切面编程(AOP)

SpringAOP深入学习