AOP技术

/ Spring / 没有评论 / 575浏览

在上几篇中本人基本已经将IOC容器涉及到的知识全部介绍完了,从今天起我们学习一下spring中的另一个非常重要的技术AOP。AOP并不是spring中所独创的技术,因为AOP可以理解为是一种编程思想,例如OOP(面向对象编程)一样。只是最近它才被作为一项技术真正的用于软件开发中的。那么到底什么是AOP呢?AOP的全称为Aspect Oriented Programing。看翻译我们基本就可以猜出AOP的名字了,也就就是我们常常听说的面象切面编程。我们通过下面的例子来展示AOP到底能够解决我的方法中的什么问题?

我们在日常开发时知道,如果多个类中有相同的代码,那么我们就要考虑抽取一个公共的抽象类或接口,将多个类中的相同的代码提取到抽象类中去实现,不同的逻辑放到相应的子类中去处理,这样不但方便我们开发与维护,还遵循了软件重构的思想。那么这样真的能消除掉决子类中的重复代码吗?我们看下面的例子:

public class TransactionManager {
public static void beginTransaction() {
System.out.println("开启事物");
}
public static void commit() {
System.out.println("提交事物");
}
}
public class UserService {

public void login() {
TransactionManager.beginTransaction();
System.out.println("用户登陆");
TransactionManager.commit();
}

public void register() {
TransactionManager.beginTransaction();
System.out.println("用户注册");
TransactionManager.commit();
}

}

我们看上述的代码UserService类中只有简单的代码,我们用一条输出语句代替具体的业务逻辑,但是在我们日常开发,常常需要向上述的代码一样,为相应的逻辑添加事物以解决一致性的问题。这时上述的代码的弊端也就展现出来的,也就是业务代码中会有大量的事物管理的代码,并且这些代码,我们并没办法法通过提取抽象类的方法解决。这时如果我们想要消除到业务逻辑里的事物代码就要考虑使用AOP解决了。那么spring中怎么用AOP解决上述问题呢?先不要着急,我们先抛砖引玉在后面的文章中我们在看具体的解决办法法,我们接下来了解一下spring中AOP其它方法的知识。

在spring的AOP中定义了一些基本的术语,我们下面将介绍这些术语的具体名字与作用。

程序执行的某个特定位置,也就是类的方法调用前、调用后、方法抛出异常后等。在spring中连接点只支持方法的连接点,也就是只能在类的方法调用前、调用后、方法抛出异常后等。

切点就也是定位特定的连接的。简单一点的比喻就是连接点相当于数据库的记录,而切点就相当于查询条件。所以,在spring中切点与连接点不是一一对应的关系,一个切点可以匹配多个连接点。

增强就是添加到目标类连接点上的代码,也就是上述我们例子中的添加事物的代码。正是因为如此,所有spring为我们提供的增强接口都是带方位名的,例如BeforeAdvice、AfterReturningAdvice等。

也就是添加增强逻辑的目标类。

一种特殊的增强,它可以为类添加一些属性和方法。即使这个类没有实现某个接口,通过引介也可以动态为该类添加接口的实现逻辑。

织入就是将增强添加到目标类具体连接点的过程。AOP有三种类型的织入它们分别是:

  1. 编译期织入
  2. 类装载期织入
  3. 动态代理织入,在运行期为目标类添加增强生成子类的方法。

spring采用动态织入,而AspectJ采用编译织入和类装载期织入。

目标类被增强后就会生成一个新的包括增强逻辑的代理类。我们就是使用这个代理类,来完成我们横切的逻辑。

切面由切点和增强组成,它即包括横切的逻辑,也包括连接点的定义。