深入理解spring AOP

概念

AOP(Aspect-Oriented Programming)即面向切面编程。它是对传统的OOP(面向对象)编程的一种补充,在OOP中往往一个对象有什么行为我们就定义什么方法,对象与对象之间存在紧密联系。与OOP不同的是AOP更加关注的是切面,我们只需要关注于对象的核心业务而不是所有的业务。



解析:如同上图1中所示,两个螺丝就是一种紧密耦合的关系, 一旦一方存在问题,另一方也必须做出相应调整。而图2为一个笔记本的USB插口,只要符合这个接口的设备都可以使用这个插口。
在程序中也和现实生活一样,使用spring AOP就是一种典型的非耦合案例,AOP的核心之一就是我们的非核心业务与我们的核心业务解耦。
具体实现:(本例我们模拟一个女孩子的日常生活,去KFC,约会,遛狗几个事务.PS:不会有女孩子看到这篇博客吧…)

第一步:直入主题,构造核心业务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package aop_demo;

/*
*
*/
public class Girl1 implements Girl{

private Dog dog = null;

public void setDog(Dog dog) {
this.dog = dog;
}

public void KFC(String datetime){

System.out.println("[核心业务逻辑]我是第一个女孩");
System.out.println("[核心业务逻辑]"+datetime+"吃肯德基");
}

public void meet(String datetime){

System.out.println("[核心业务逻辑]我是第一个女孩");
System.out.println("[核心业务逻辑]"+datetime+"约会");

}

@Override
public void playDog() {

dog.bark();

}

}

解析:由上段代码可以看到这个例子中没有出现任何其他非业务逻辑代码,因此在一个程序中我们在多个流程中反复出现的一些非核心代码抽取出来由代理给我们管理。我们发现这几个事务之前我们的对象(女孩子)都要洗澡,化妆……之后都要卸妆….这些非逻辑业务便是我们需要分离出来的。

第二步:使用代理统一管理非逻辑业务


解析:上图中的通知其本质也就是代理,由于本例中前后都有非核心业务,因此我们选择环绕通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package aop_demo;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;


public class AroundAdvice implements MethodInterceptor {

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {

//前置业务
System.out.println("[代理执行前置]洗澡");
System.out.println("[代理执行前置]化妆");
System.out.println("[代理执行前置]穿衣服");
System.out.println("*****************");

//核心业务
Object result = invocation.proceed();

//后置业务
System.out.println("*****************");
System.out.println("[代理执行后置]卸妆");
System.out.println("[代理执行后置]洗澡");
System.out.println("[代理执行后置]听歌");
System.out.println("");

return result;
}


}

第三步:配置applicationContext.xml文件(部分)

1
2
3
4
5
6
<bean id="aroundAdvice" class="aop_demo.AroundAdvice"></bean>

<bean id="girlProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interceptorNames" value="aroundAdvice"></property>
<property name="target" ref="girl"></property>
</bean>
坚持原创技术分享,您的支持将鼓励我继续创作!