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");
}
}
实现同等效果。