1、实现方式不同 aop:aspect定义切面时,只需要定义一般的bean就行,而定义 aop:advisor中引用的通知时,通知必须实现Advice接口。下面我们举例说明。 首先,我们定义一个接口Sleepable和这
< aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。 下面我们举例说明。 首先,我们定义一个接口Sleepable和这个接口的实现Human,代码如下: public interface Sleepable { public void sleep(); } public class Human implements Sleepable { @Override public void sleep() { System.out.println("我要睡觉了!"); } } 下面是< aop:advisor>的实现方式: //定义通知 public class SleepHelper implements MethodBeforeAdvice,AfterReturningAdvice{ @Override public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { System.out.println("睡觉前要脱衣服!"); } @Override public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable { System.out.println("起床后要穿衣服!"); } } //aop配置2、使用场景不同下面是< aop:aspect>的实现方式: //定义切面 public class SleepHelper2{ public void beforeSleep(){ System.out.println("睡觉前要脱衣服!"); } public void afterSleep(){ System.out.println("起床后要穿衣服!"); } } //aop配置 测试代码如下: public class TestAOP { public static void main(String[] args) { method1(); // method2(); } private static void method1() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml"); Sleepable sleeper = (Sleepable) context.getBean("human"); sleeper.sleep(); } private static void method2() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml"); Sleepable sleeper = (Sleepable) context.getBean("human"); sleeper.sleep(); } //执行结果 睡觉前要脱衣服! 我要睡觉了! 起床后要穿衣服! }
< aop:advisor>大多用于事务管理。 例如: < aop:aspect>大多用于日志,缓存 其实,不管是< aop:advisor>还是< aop:aspect>最终的实现逻辑是一样的。