Spring也能支持多個切面。當有多個切面時,它不會存在任何順序,這些順序代碼會隨機生成,可是有時候咱們但願它按照指定的順序運行。
在此以前要先定義一個切點方法,爲此新建一個接口——MultiBeanspring
代碼清單:定義多個切面的切點方法ide
package com.ssm.chapter11.multi.bean; public interface MultiBean { public void testMulti(); }
代碼清單:實現MultiBean接口測試
package com.ssm.chapter11.multi.bean.impl; import com.ssm.chapter11.multi.bean.MultiBean; import org.springframework.stereotype.Component; /****************imports****************/ @Component public class MultiBeanImpl implements MultiBean { // @Override public void testMulti() { System.out.println("test multi aspects!!"); } }
代碼清單:3個切面spa
package com.ssm.chapter11.multi.aspect; import org.aspectj.lang.annotation.*; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; /**************** imports ****************/ @Aspect // @Order(1) public class Aspect1 implements Ordered { // @Override public int getOrder() { return 1; } @Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))") public void print() { } @Before("print()") public void before() { System.out.println("before 1 ......"); } @After("print()") public void after() { System.out.println("after 1 ......"); } @AfterThrowing("print()") public void afterThrowing() { System.out.println("afterThrowing 1 ......"); } @AfterReturning("print()") public void afterReturning() { System.out.println("afterReturning 1 ......"); } }
package com.ssm.chapter11.multi.aspect; import org.aspectj.lang.annotation.*; import org.springframework.core.annotation.Order; /**************** imports ****************/ @Aspect @Order(2) public class Aspect2 { @Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))") public void print() { } @Before("print()") public void before() { System.out.println("before 2 ......"); } @After("print()") public void after() { System.out.println("after 2 ......"); } @AfterThrowing("print()") public void afterThrowing() { System.out.println("afterThrowing 2 ......"); } @AfterReturning("print()") public void afterReturning() { System.out.println("afterReturning 2 ......"); } }
package com.ssm.chapter11.multi.aspect; import org.aspectj.lang.annotation.*; import org.springframework.core.annotation.Order; /**************** imports ****************/ @Aspect @Order(3) public class Aspect3 { @Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))") public void print() { } @Before("print()") public void before() { System.out.println("before 3 ......"); } @After("print()") public void after() { System.out.println("after 3 ......"); } @AfterThrowing("print()") public void afterThrowing() { System.out.println("afterThrowing 3 ......"); } @AfterReturning("print()") public void afterReturning() { System.out.println("afterReturning 3 ......"); } }
代碼清單:多切面測試Java配置code
package com.ssm.chapter11.multi.config; import com.ssm.chapter11.multi.aspect.Aspect1; import com.ssm.chapter11.multi.aspect.Aspect2; import com.ssm.chapter11.multi.aspect.Aspect3; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; /****************imports****************/ @Configuration @EnableAspectJAutoProxy @ComponentScan("com.ssm.chapter11.multi") public class MultiConfig { @Bean public Aspect1 getAspect1() { return new Aspect1(); } @Bean public Aspect2 getAspect2() { return new Aspect2(); } @Bean public Aspect3 getAspect3() { return new Aspect3(); } }
代碼清單:測試blog
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(MultiConfig.class); MultiBean multiBeanService = ctx.getBean(MultiBean.class); multiBeanService.testMulti(); }
如何讓它有序執行:
1.@Order(1),@Order(2),@Order(3) 註解
2.實現 implements Ordered
3.<aop:aspect ref="aspect1" order="1"> 接口