通過aop在目標邏輯代碼前後增加其他功能,先創建某個類用於某個功能。例如創建服務員,用來模擬服務功能。
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添加禮貌功能,先模擬添加禮貌功能的代碼
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是目標實例。
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。
屬性介紹:proxyInterfaces,指定代理的接口
interceptorNames,使用的增強
target-ref,對目標實例進行處理