前置加強:java
經過aop在目標邏輯代碼先後增長其餘功能,先建立某個類用於某個功能。例如建立服務員,用來模擬服務功能。spring
1 package AOPdemo; 2 3 public class NaiveWaiter implements Waiter { 4 5 @Override 6 public void greetTo(String name) { 7 System.out.println("greetTO "+name); 8 } 9 10 @Override 11 public void serveTo(String name) { 12 System.out.println("serveTo "+name); 13 } 14 15 }
此服務員並無禮貌語氣,經過aop添加禮貌功能,先模擬添加禮貌功能的代碼ide
1 package AOPdemo; 2 3 import java.lang.reflect.Method; 4 5 import org.springframework.aop.MethodBeforeAdvice; 6 7 public class GreetBeforeAdvice implements MethodBeforeAdvice { 8 9 @Override 10 public void before(Method arg0, Object[] args, Object obj) throws Throwable { 11 12 String client = (String)args[0]; 13 System.out.println("welcome "+client); 14 15 } 16 17 }
此類經過實現MethodBeforeAdvice接口,重寫前置加強方法來實現功能。arg0是目標方法的全名,args是目標方法入參,obj是目標實例。spa
1 package AOPdemo; 2 3 import org.springframework.aop.framework.ProxyFactory; 4 5 public class WaiterBerforeTest { 6 7 public static void main(String[] args) { 8 9 Waiter target = new NaiveWaiter(); 10 11 GreetBeforeAdvice advice = new GreetBeforeAdvice(); 12 13 ProxyFactory pf = new ProxyFactory(); 14 15 pf.setTarget(target); 16 17 pf.addAdvice(advice); 18 19 Waiter waiter = (Waiter)pf.getProxy(); 20 waiter.greetTo("kobe"); 21 waiter.serveTo("jordan"); 22 23 } 24 25 }
上述代碼中使用ProxyFactory工廠建立代理對象,從而完成在目標方法上的加強,也可以使用spring的配置方式來完成。代理
1 <!-- aop配置 --> 2 <bean id="target" class="AOPdemo.NaiveWaiter" ></bean> 3 <bean id="greetBeforeAdvice" class="AOPdemo.GreetBeforeAdvice"></bean> 4 5 <bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean" 6 p:proxyInterfaces="AOPdemo.Waiter" 7 p:interceptorNames="greetBeforeAdvice" 8 p:target-ref="target" 9 />
ProxyFactoryBean在內部使用ProxyFactory來完成。ProxyFactoryBean實現了FactoryBean來建立bean。code
屬性介紹:proxyInterfaces,指定代理的接口對象
interceptorNames,使用的加強blog
target-ref,對目標實例進行處理接口
後置加強:get
1 package AOPdemo; 2 3 import java.lang.reflect.Method; 4 5 import org.springframework.aop.AfterReturningAdvice; 6 7 public class GreetAfterAdvice implements AfterReturningAdvice { 8 9 @Override 10 public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable { 11 12 System.out.println("please enjoy yourself"); 13 14 } 15 16 }
1 <bean id="target" class="AOPdemo.NaiveWaiter" ></bean> 2 <bean id="greetBeforeAdvice" class="AOPdemo.GreetBeforeAdvice"></bean> 3 <bean id="greetAfterAdvice" class="AOPdemo.GreetAfterAdvice" ></bean> 4 5 <bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean" 6 p:proxyInterfaces="AOPdemo.Waiter" 7 p:interceptorNames="greetBeforeAdvice,greetAfterAdvice" 8 p:target-ref="target" 9 />