什么是AOP
Spring是用来解决实际开发中的一些问题的,AOP解决了OOP中遇到的一些问题,是OOP的延续和扩展。我们可从以下三个方面来理解AOP:
- 扩展功能不是通过修改源代码而实现的。
可通过Struts2框架中的拦截器来理解。 AOP采用横向抽取机制实现。
要理解横向抽取机制,就必须认识纵向抽取机制。例如有如下的一个类:public class User { public void add() { 添加的逻辑... } }
现在我们在add()方法中要扩展一个功能,即日志添加功能,添加完该功能之后,可记录在什么时候添加了哪个用户。想到的最原始的方法就是直接修改源代码。
public class User { public void add() { 添加的逻辑... 直接写添加日志记录的代码以实现... } }
很显然这是一种愚蠢的做法,并且这儿还有一个原则——修改功能一般不是直接修改源代码来实现的。顺其自然地就要来讲纵向抽取机制了,这时我们可编写一个BaseUser类。
public class BaseUser { public void wirtelog() { 记录日志的逻辑... } }
接下来让User类继承BaseUser类,如下:
public class User extends BaseUser { public void add() { 添加的逻辑... // 记录日志 super.wirtelog(); } }
这样是不是就万事大吉了呢?你懂的!因为当父类的方法名称变化时,子类调用的方法也必然要进行修改。最后终于要讲横向抽取机制了,横向抽取机制分为两种情况,下面分别加以简单阐述。
有接口情况的横向抽取机制:
例如有一个如下接口:public interface UserDao { public void add(); }
接口的一个实现类如下:
public class UserDaoImpl implements UserDao { public void add() { ... } }
我们现在即可使用动态代理技术增强类里面的方法,即创建接口的实现类代理对象,并增强UserDaoImpl类里面的add()方法。
无接口情况的横向抽取机制:
例如有一个如下User类:public class User { public void add() { ... } }
我们也可使用动态代理技术增强类里面的方法,即创建被增强方法所在类的子类代理对象,并增强User类里面的add()方法。
- AOP底层使用动态代理实现
- 有接口情况:创建接口实现类代理对象,jdk动态代理 (创建一个与 增强方法所在类 平级的对象,不是真正的对象,代理对象,实现和daoImpl相同的功能)
- 没有接口情况:创建增强方法所在类的子类代理对象,使用cglib动态代理