【Spring】Spring 3.x企业应用开发实战(9)----AOP前置增强

AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring中增强类型有五种,按增强的位置分为以下5类。

1、前置增强:org.springframework.aop.BeforeAdvice代表前置增强,因为Spring只支持方法级增强,所以MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定义的。

下面是前置增强的实例:

首先Waiter接口:

 

package com.smart.advice;

public interface Waiter 
{
	void greetTo(String name);
	void serveTo(String name);
}


NaiveWaiter.java

 

 

package com.smart.advice;

public class NaiveWaiter implements Waiter {

	@Override
	public void greetTo(String name) 
	{
		System.out.println("Greet to "+name+"...");
	}

	@Override
	public void serveTo(String name) 
	{
		System.out.println("Serving to "+name+"...");
	}

}

GreetingBeforeAdvice.java

 

 

package com.smart.advice;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class GreetingBeforeAdvice implements MethodBeforeAdvice{

	@Override
	public void before(Method arg0, Object[] arg1, Object arg2)//在目標類方法調用前執行
			throws Throwable 
	{
		String clientName=(String)arg1[0];
		System.out.println("How are you! Mr."+clientName+".");		
	}

}


BeforeAdviceTest.java

 

 

package com.smart.advice;

import org.junit.Before;
import org.junit.Test;
import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;

public class BeforeAdviceTest
{
	private Waiter target;
	private BeforeAdvice advice;
	private ProxyFactory pf;
	
	@Before
	public void init()
	{
		target=new NativeWaiter();
		advice=new GreatingBeforeAdvice();
		
		pf=new ProxyFactory();//Spring提供的代理工廠
		pf.setTarget(target);//設置代理目標
		pf.addAdvice(advice);//為代理目標添加增強
	}
	
	@Test
	public void beforeAdvice()
	{
		Waiter proxy=(Waiter)pf.getProxy();
		proxy.greetTo("John");		
		proxy.serveTo("Tom");
	}
}


正如我们所预计的结果:

 

How are you! Mr.John.
Greet to John...
How are you! Mr.Tom.
Serving to Tom...

 

2、通过在Spring中的配置实现增强:

 

<bean id="greetingAdvice" class="com.smart.advice.GreatingBeforeAdvice"/>
	<bean id="target" class="com.smart.advice.NativeWaiter"/>
	<bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
		p:proxyInterfaces="com.smart.advice.Waiter"
		p:interceptorNames="greetingAdvice"
		p:target-ref="target"/>

 

 

SpringAdviceTest.java

 

waiter.serveTo("Tom");package com.smart.advice;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringAdviceTest 
{
	@Test
	public void testAdvice()
	{
		String configPath="com/smart/advice/beans.xml";
		ApplicationContext ctx=new ClassPathXmlApplicationContext(configPath);
		Waiter waiter=(Waiter)ctx.getBean("waiter");
		waiter.greetTo("John");waiter.serveTo("Tom");
	}
}


实现同等效果。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值