※XML設定
IAOP.java和AOP.java
public interface IAOP { public String C(); } @Named public class AOP implements IAOP { @Override public String C() { System.out.println("無參數C"); return "c"; } }
IChess.java和ChessImpl
public interface IChess { public void chessName(); public String C(); } @Component public class ChessImpl implements IChess { @Override public void chessName() { System.out.println("象棋!"); } @Override public String C() { System.out.println("ChessImpl"); return "ChessImpl"; } }
applicationContext.xml
<context:component-scan base-package="\" /> <aop:config> <aop:aspect ref="beforeAfter"> <aop:declare-parents types-matching="aop.AOP+" implement-interface="service.IChess" default-impl="impl.ChessImpl" /> </aop:aspect> </aop:config>
※aop.AOP+表示AOP的兒子,也可以用「*」等,和之前的pointcut一樣
※整行的意思是AOP的兒子可以轉成IChess
測試類
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // IAOP aop = (IAOP) ctx.getBean("AOP"); IChess aop = (IChess) ctx.getBean("AOP"); // IChess aop = (IChess) ctx.getBean("AOP", IAOP.class); // IChess aop = (IChess) ctx.getBean("AOP", IChess.class); aop.chessName(); aop.C(); // 失敗 // AOP aop = (AOP) ctx.getBean("AOP"); // IAOP aop = (IAOP) ctx.getBean("chessImpl"); ((ClassPathXmlApplicationContext) ctx).close();
※結果:
象棋!
無參數C
※要注意方法一樣並沒有轉成設定的方法
※上面4行都是ok的,也就是AOP可以轉成自己的IAOP和設定的IChess
※這種方式只有支援interface,所以AOP轉AOP會錯
※xml的設定是AOP的兒子可以轉IChess,相反當然是不行
※Annotation設定
Annotation用的是@DeclareParents,只能寫在Field,我不太會用※Advice
前幾篇用的before、after等方法,這是較早期用的方式
BeforeAfter.java
@Named @Aspect public class BeforeAfter implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target) { System.out.println("方法=" + method); System.out.println("參數=" + Arrays.toString(args)); System.out.println("物件=" + target); } }
※要實作MethodBeforeAdvice的before方法
applicationContext.xml
<context:component-scan base-package="\" /> <aop:config> <aop:advisor advice-ref="beforeAfter" pointcut="execution(public void aop.AOP.A())" /> </aop:config>
測試類
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); IAOP aop = (IAOP) ctx.getBean("AOP"); aop.A(); ((ClassPathXmlApplicationContext) ctx).close();
※以前的方法每一個class都要實作MethodBeforeAdvice,所以現在很少人用了
沒有留言:
張貼留言