认识AOP
是什么?能干什么?怎么用?怎么用得更好?
关系:面相切面编程(AOP)是面相对象编程(OOP)的补充。
在OOP中,最小建模单元是class,在AOP中最小单元则是切面。
概念: 切面(aspect)
理解一个概念,最好的方式,是学习例子。下面用一个例子来进行学习。
Jack如何将大象放进冰箱呢?
只需要三步:1.打开冰箱 2.放入大象3.关上冰箱
Person jack = new Person("Jack");
putElephantIntoRefridg();
public static void putElephantIntoRefridg(){
System.out.println("Jack open the refridge");
System.out.println("Jack put an elephant into the refridge");
System.out.println("Jack close the refridge");
}
好的,这个太死了,升级一下。加几个参数灵活配置。
这样一来,无论谁都可以想放什么就放什么啦。
Person Jack = new Person("jack");
putSthIntoRefridge(Jack.getName(), "elephant");
putSthIntoRefridge(Jack.getName(),"");
...
//放东西到冰箱里
public static void putSthIntoRefridge(String operatorName, String sth){
beforePut(operatorName);
System.out.println(operatorName +" put "+ sth +"into refridge");
afterPut(operatorName);
}
//开冰箱
public static void beforePut(String operatorName){
System.out.println(operatorName +" open the refridge");
}
//关冰箱
public static void afterPut(String operatorName){
System.out.println(operatorName +" close the refridge");
}
一定程度上的将开关冰箱的代码从业务代码(放进冰箱)抽取了出来。
还是扩展性不足。比较局限。
比如,Jack接下来要出远门。放完以后,还要求检查电费是否充足,不够就充钱。避免电费不够,自动断电以后,冰箱里的东西坏掉了。(很多智能电表已经是充多少用多少了)
那这种情况下,只能改原来的代码,加一个CheckFees()步骤。
我的理解中。AOP就是为了更好配置管理,这种,和业务逻辑无关,但又不得不做、有规范流程的代码。比如事务管理。
结合例子,对应起来。
开涛的跟我学Spring
开涛大哥的博客里,就有对术语的浅显化解释。我们也应当有自己的理解。
- Aspect 切面。可以根据各个类中的切点匹配,横切多个类
- Join point 切点,程序执行点。通常是方法执行前后。
- Advice 切面在某个切点执行的动作。有几种类型:”around”,”before”,”after”
- Pointcut 切点表达式。类似与正则表达式,匹配方法名,来切入。
- Introduction 声明额外的方法或者属性。用这个来给被切的对象增加继承接口
- Target object 被切面进而被增加方法调用的类,been advised object。
- AOP proxy AOP代理类
- Weaving 织入可以是在编译期,装载期,运行期。Spring是在运行期织入。
Advice的几种类型
- Before advice
前置增强。切点前执行,除非抛出异常,否则就按顺序执行切点 - After returning advice
后置增强1。在切点正常执行后执行(切点处未抛出异常) - After throwing advice
抛出增强。切点方法抛出异常时执行 - After (finally) advice
后置增强2。切点方法完成后执行,不管是否抛出异常 - Around advice
环绕增强。最牛啤。可以在方法前后增强,也可以通过其返回值,来选择性执行增强方法,或切点。