服务员接口 Waiter.java
package com.paic.zhangqi.spring.aop;
public interface Waiter {
void greetTo(String name);
void serveTo(String name);
}
服务员接口实现类 NaiveWaiter.java
package com.paic.zhangqi.spring.aop;
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 "+name+"...");
}
}
前置增强类
GreetingBeforeAdvice.java 在目标类方法执行前执行
package com.paic.zhangqi.spring.aop;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object obj) throws Throwable {
String clientName = (String)args[0];
System.out.println("How are you!Mr."+clientName+".");
}
}
后置增强类GreetingAfterAdvice.java
在目标类方法调用后执行
package com.paic.zhangqi.spring.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class GreetingAfterAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println("Please enjoy yourself!");
}
}
测试类 TestAdvice.java
package com.paic.zhangqi.spring.aop;
import org.springframework.aop.AfterAdvice;
import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;
public class TestAdvice {
public static void main(String[] args) {
Waiter target = new NaiveWaiter();
BeforeAdvice beforeAdvice = new GreetingBeforeAdvice();
AfterAdvice afterAdvice = new GreetingAfterAdvice();
// spring 提供的代理工厂
ProxyFactory pf = new ProxyFactory();
// 设置代理目标
pf.setTarget(target);
// 为代理目标添加增强
pf.addAdvice(beforeAdvice);
pf.addAdvice(afterAdvice);
// 生成代理实例
Waiter proxy = (Waiter)pf.getProxy();
proxy.greetTo("John");
proxy.serveTo("Tomcat");
}
}
输出结果
How are you!Mr.John.
greet to John...
Please enjoy yourself!
How are you!Mr.Tomcat.
serving Tomcat...
Please enjoy yourself!
使用配置文件进行配置 beans.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="greetingBefore" class="com.paic.zhangqi.spring.aop.GreetingBeforeAdvice" />
<bean id="greetingAfter" class="com.paic.zhangqi.spring.aop.GreetingAfterAdvice" />
<bean id="target" class="com.paic.zhangqi.spring.aop.NaiveWaiter" />
<bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="com.paic.zhangqi.spring.aop.Waiter" />
<property name="interceptorNames" value="greetingBefore,greetingAfter" />
<property name="target" ref="target" />
</bean>
</beans>对应的测试类 SpringConfigTest.java
package com.paic.zhangqi.spring.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringConfigTest {
public static void main(String[] args) {
String configPath = "com/paic/zhangqi/spring/aop/beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Waiter waiter = (Waiter) ctx.getBean("waiter");
waiter.greetTo("John");
waiter.serveTo("Tomcat");
}
}
同样得到输出
How are you!Mr.John.
greet to John...
Please enjoy yourself!
How are you!Mr.Tomcat.
serving Tomcat...
Please enjoy yourself!
本文通过一个服务员接口的实例,演示了Spring AOP中的前置增强(GreetingBeforeAdvice)和后置增强(GreetingAfterAdvice)的使用。在Waiter接口和其实现类NaiveWaiter中,定义了服务行为。通过配置beans.xml,结合TestAdvice测试类,展示了如何在方法执行前后插入自定义逻辑。
1100

被折叠的 条评论
为什么被折叠?



