<strong>在SpringAOP中提供了前置、後置以及環繞增強機制。這些功能大大方便了我們對log、性能等方面的處理。下面就以一個實例來代碼講解AOP的增強功能。</strong>
首先定義一個藉口Waiter
package com.jike.spring.chapter10.aop.advice;
public interface Waiter {
void greet(String name);
void server(String name);
}
實現Waiter
package com.jike.spring.chapter10.aop.advice;
public class NativeWaiter implements Waiter{
@Override
public void greet(String name) {
System.out.println("greet " + name);
}
@Override
public void server(String name) {
System.out.println("server " + name);
}
}
前置增強類
package com.jike.spring.chapter10.aop.advice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class WaiterBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
String user = (String) arg1[0];
System.out.println("hello " + user);
}
}
後置增強類
package com.jike.spring.chapter10.aop.advice;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class WaiterAfterAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.println("this is after advice");
}
}
環繞增強類
package com.jike.spring.chapter10.aop.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class WaiterAroundAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
Object obj[] = arg0.getArguments();
String name = (String) obj[0];
System.out.println("this is befor advice" + name);
arg0.proceed();
System.out.println("this is after advice" + name);
return null;
}
}
配置文件
<?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.jike.spring.chapter10.aop.advice.WaiterBeforeAdvice" />
<bean id="greetingAfter" class="com.jike.spring.chapter10.aop.advice.WaiterAfterAdvice" />
<bean id="greetingAround" class="com.jike.spring.chapter10.aop.advice.WaiterAroundAdvice" />
<bean id="target" class="com.jike.spring.chapter10.aop.advice.NativeWaiter" />
<bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="com.jike.spring.chapter10.aop.advice.Waiter"
p:target-ref="target" p:interceptorNames="greetingAround" />
</beans>
測試類
package com.jike.spring.chapter10.aop.advice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBeforeAdvice {
public static void main(String[] args) {
String path = "conf/conf-advice.xml";
ApplicationContext acc = new ClassPathXmlApplicationContext(path);
Waiter waiter = (Waiter) acc.getBean("waiter");
waiter.greet("victor");
waiter.server("victor");
}
}
怎麼樣?簡單易懂吧,希望對您的學習有所幫助!