@AspectJ可以使用切点函数定义切点,我们还可以使用逻辑运算符对切点进行复核运算得到复合的切点,为了在切面中重用切点,我们还可以对切点进行命名,以便在其他的地方引用定义过的切点。
当一个连接点匹配多个切点时,需要考虑织入顺序的问题,此外一个重要的问题是如何再增强中访问连接点上下文的信息。
Waiter接口:
package com.yyq.aspectJAdvanced;public interface Waiter { void greetTo(String name); void serveTo(String name);}NaiveWaiter实现类:
package com.yyq.aspectJAdvanced;public class NaiveWaiter implements Waiter { @Override public void greetTo(String name) { System.out.println("NaiveWaiter:greet to " + name + "..."); } @Override public void serveTo(String name) { System.out.println("NaiveWaiter:serving to " + name + "..."); } public void smile(String clientName,int times){ System.out.println("NaiveWaiter:smile to "+clientName+ times+"times..."); }}NaughtyWaiter实现类:
package com.yyq.aspectJAdvanced;public class NaughtyWaiter implements Waiter { public void greetTo(String clientName) { System.out.println("NaughtyWaiter:greet to " + clientName + "..."); } public void serveTo(String clientName) { System.out.println("NaughtyWaiter:serving " + clientName + "..."); } public void joke(String clientName, int times) { System.out.println("NaughtyWaiter:play " + times + " jokes to " + clientName + "..."); }}Seller接口:
package com.yyq.aspectJAdvanced;public interface Seller { int sell(String goods, String clientName);}SmallSeller实现类:
package com.yyq.aspectJAdvanced;public class SmartSeller implements Seller { public int sell(String goods,String clientName) { System.out.println("SmartSeller: sell "+goods +" to "+clientName+"..."); return 100; } public void checkBill(int billId){ if(billId == 1) throw new IllegalArgumentException("iae Exception"); else throw new RuntimeException("re Exception"); }}beans.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://\\yyq\\aspectJAdvanced\\beans.xml"; ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath); SmartSeller seller = (SmartSeller) ctx.getBean("seller"); seller.checkBill(1); }输出结果:
---bindException---exception:iae Exception---bindException---以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。