之前写了一篇《初识AOP》的文章,在灌水区引起了热烈的讨论,这是我始料未及的。这一次将更深入的探寻AOP的奥秘,让大家不再不明觉厉,而是惊叹AOP的鬼斧神工。
先来看看AOP的几个基本概念:
切面:在《初识AOP》这篇文章中已经讲到这个概念,可以将其理解为公共服务,或者更简单一些理解为一个公共类,这个类提供了业务类会复用的方法;
切点:明确了公共类从哪个位置切入到业务类当中,也就是说业务类在被执行的时候,什么时候什么位置会被触发调用公共类的可复用方法;
通知:公共类中提供的可复用方法就是通知。
光看这些晦涩的概念总让人会很晕,如果有个例子能跑起来,看看AOP是如何工作的,我们才会佩服,才会兴趣爆棚。
定义一个Verifier.java类用来验证充值的金额
@Component("Verifier")
public class Verifier {
public Verifier() {
// TODO Auto-generated constructor stub
}
public void verifyMoney(double money) {
if(money <= 0) {
System.out.println("The recharge money " + money + " is invalid...");
} else {
System.out.println("The recharge money " + money + " is valid...");
}
}
}
定义Cust接口,里面有充值的方法
public interface Cust {
void recharge(double money);
}
普通客户,实现了接口的方法
@Component("NormalCust")
public class NormalCust implements Cust {
private double money;
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public NormalCust () {
}
public void recharge(double money) {
// TODO recharge
}
}
通过配置文件实现切面、切点和通知
<aop:config proxy-target-class="true">
<aop:aspect ref="Verifier">
<aop:pointcut id="recharge" expression="execution(* com.test.Cust.recharge(double)) and args(money)"/>
<aop:after pointcut-ref="recharge" method="verifyMoney" arg-names="money"/>
</aop:aspect>
</aop:config>
测试类:
public class AopTest {
@Autowired
NormalCust cust;
@Test
public void testAutoScan() {
cust.recharge(-300);
}
}
好了,现在运行起来吧,看结果:
结果和我们预期一致,如果修改测试类,为正的金额,就会显示该金额合法。从中我们可以看到,AOP会帮我们捕获到切点方法的执行,然后通过切面来执行通知方法。