Java及Spring框架中的AOP技术汇总--原理篇

Spring框架目前是Java中主流的web开发框架,其两大技术基石是: Ioc容器以及AOP
本系列关注AOP相关内容

1. 什么是AOP:

AOP: (Aspect Oriented Programming) 面向切面编程。是目前软件开发中的一个热点,也是Spring框架中重点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。

2. AOP的本质是Hook(方法的拦截)

在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程

在c/c++中,拦截方法的二进制代码,就是传说中的外挂破解技术。

3. 利用虚函数动态绑定来模拟AOP:

  • 先定义一个IGreet的接口:
package blf_aop_demo;
/*
1. 从java语言的角度来演示aop的两种实现(基于接口实现和基于类实现)
2. spring
*/
public interface IGreet {
    void sayHello(String name);

    void sayGoodBye(String name);
}
  • 实现该接口:
package blf_aop_demo;

public class GreetImp implements IGreet {
    public void sayHello(String name) {
        System.out.println("Hello " + name);
    }

    public void sayGoodBye(String name) {
        System.out.println("GoodBye " + name);
    }
}
  • 实现一个代理类,并且实现IGreet接口,在代理类中引用GreetImp:
package blf_aop_demo;

//1. GreetProxy: 实现了IGreet接口
public class GreetProxy implements IGreet {

    //2. 又引用了一个IGreet接口
    private IGreet target = null;
    
    //3. 通过构造函数让target指向实现者
    public GreetProxy(IGreet target){
        this.target = target;
    }
    
    //4. 重写了基类的sayHello函数
    public void sayHello(String name) {
        //4.1 在调用所代理的目标的sayHello前,先做一些你想做的事情
        System.out.println("--before method sayHello");
        
        //4.2 调用被代理的目标的sayHello函数
        target.sayHello(name);
        
        //4.3 完成后,做一些你想做的事情
        System.out.println("--after method sayHello");
        
        //由此可见,这是经典的代理设计模式的实现
    }
    
    //5. 同上原理
    public void sayGoodBye(String name) {
        System.out.println("--before method goodBye");
        target.sayGoodBye(name);
        System.out.println("--after method goodBye");
    }

}
  • 测试代码:
public class AopDemo {
    
    public static void testGreet(){
        //给GreetImp分配内存,注意返回的是IGreet接口
        IGreet real = new GreetImp();
        
        //代理也是返回IGreet,同时构造函数也传入一个来自GreetImp的接口(real真实对象)
        IGreet greet = new GreetProxy(real);
        
        //利用虚函数动态绑定机制(多态),此时调用的是GreetProxy中的sayHello和sayGoodBye
        greet.sayHello("jacky");
        greet.sayGoodBye("jacky");
    }

       public static void main(String[] args) {
              System.out.println("blf_aop_demo_test");
              testGreet();
      }
}
  • 输出结果:
blf_aop_demo_test
--before method sayHello
Hello jacky
--after method sayHello
--before method goodBye
GoodBye jacky
--after method goodBye

由此可见,aop最基础的实现原理就是:proxy设计模式,利用虚函数动态绑定机制

但是,很麻烦,需要声明接口,然后生成一个实现类,以及一个代理类,在代理类中又要实现接口,并且调用实现类的方法。这些都是很通用,一成不变的操作。通过使用java反射机制,很容易的变成一套固定的框架.这个在jdk中已经帮你弄好了,下一篇我们来看一下JDKProxy方式的使用!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,997评论 19 139
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,568评论 1 133
  • 想做什么赶紧抓紧时间做 每个点都有特别特别想做的事 只要想做就赶紧去吧 我是觉得,只要错过了那个兴奋的时刻,就很难...
    唯i阅读 103评论 0 0
  • 第一名:邵阳 马超 优势:指标是我的硬性条件,首活,一阶段稳稳得分,上岗率指标三级机构中排名第一,培训班运作持续...
    糖豆DARKER阅读 372评论 4 0
  • 我的爷爷奶奶是农民,他们每天都非常忙碌。暑假的时候妈妈把我送回奶奶家,每天早上起床的时候爷爷奶奶都不在家,...
    毛虫苑卫奕然阅读 423评论 0 1