<!-- 另外写了两篇博客,一个是refresh()里面方法的基本介绍,另外一个是bean的实例化过程 -->
在介绍AOP之前,想必很多人都听说AOP是基于动态代理和反射来实现的,那么在看AOP之前,你需要确实弄懂动态代理和反射。
巧了,我这里就有。
JDK的动态代理的实现和源码分析,参见我的这两篇文章
JDK的动态代理源码分析之一 ( http://blog.csdn.net/weililansehudiefei/article/details/73655925 )
JDK的动态代理源码分析之二( http://blog.csdn.net/weililansehudiefei/article/details/73656923 )
上面的两个看懂了,那么就可以来看本篇文章了。至于Java反射知道就行,但是更巧的是我博客里正好有一篇介绍Java反射的。
Java反射的实现和基本原理,参见我的这篇文章
Java反射机制 (http://blog.csdn.net/weililansehudiefei/article/details/70194940)
那么接下里进入AOP的环节。
AOP即面向切面编程,刚学AOP的时候,单是各种AOP的概念都搞的有点懵,什么切面,切点,通知,织入、连接点、目标对象。。。。AOP的原理都没看呢,这些词语的意思就已经上人不想看了。本人将在实现AOP的时候,讲解我理解的这些AOP的术语,对应的AOP的代码和动作。
本文将先先从代码实现AOP入手,然后分析AOP的底层代码及其原理。
后期会把所有的工程实现代码,放在我的GitHub上,到时候我会更新文章。
一、AOP的Demo
如果我们对象的继承关系看成纵向关系,就像一棵树,多个不同类的多个继承关系就相当于有一排的树。AOP的好处就在于,你想对这些树进行相同的操作,这个时候,不用纵向的为每个树定义操作方法,你只需要横向的一刀切,给他们给个共有的操作方法。
Spring的AOP是支持JDK的动态代理和Cglib的动态代理的。JDK的动态代理是针对接口的,而Cglib是针对类的。本文针对JDK的动态代理。
首先定义一个接口:起名字时候特意给这个接口名,带上了Interface,这样后面会更引人注意一些。接口很简单,里面一个抽象方法eat()
package com.weili.cn;
/**
* Created by weili on 17/6/27.
*/
public interface AnimalInterface {
public abstract void eat();
}
实现类:作为一个吃货,实现类里面当然得打印 chi chi chi。撑死我吧!!!
这个实现类里面,只有一个方法,这个方法就是AOP的切点。虽然切点这个概念本身并不一定是Method,但在Spring中,所有的切点都是Method。我们增强的是方法。
package com.weili.cn;
/**
* Created by weili on 17/6/27.
*/
public class Animal implements AnimalInterface{
public void eat() {
System.out.println("Animal类中 chi chi chi");
}
}
切面类,又称增强类。因为我们是要用这个类的方法,来给原先的切点方法增强。切面类中,我们要去执行的方法,称为通知。所谓织入通知,就是将切面类里面的方法,和切点的方法进行联系。
package com.weili.cn;
import org.aopalliance.