Java及Spring框架中的AOP技术汇总--原理篇
2018-02-08 本文已影响141人
随风而行之青衫磊落险峰行
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