再探AOP

之前写了一篇《初识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会帮我们捕获到切点方法的执行,然后通过切面来执行通知方法。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值