Spring也能支持多个切面。当有多个切面时,它不会存在任何顺序,这些顺序代码会随机生成,但是有时候我们希望它按照指定的顺序运行。
在此之前要先定义一个切点方法,为此新建一个接口——MultiBean
代码清单:定义多个切面的切点方法
packagecom.ssm.chapter11.multi.bean;public interfaceMultiBean {public voidtestMulti();
}
代码清单:实现MultiBean接口
packagecom.ssm.chapter11.multi.bean.impl;importcom.ssm.chapter11.multi.bean.MultiBean;importorg.springframework.stereotype.Component;/****************imports****************/@Componentpublic class MultiBeanImpl implementsMultiBean {//@Override
public voidtestMulti() {
System.out.println("test multi aspects!!");
}
}
代码清单:3个切面
packagecom.ssm.chapter11.multi.aspect;import org.aspectj.lang.annotation.*;importorg.springframework.core.Ordered;importorg.springframework.core.annotation.Order;/**************** imports ****************/@Aspect//@Order(1)
public class Aspect1 implementsOrdered {//@Override
public intgetOrder() {return 1;
}
@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")public voidprint() {
}
@Before("print()")public voidbefore() {
System.out.println("before 1 ......");
}
@After("print()")public voidafter() {
System.out.println("after 1 ......");
}
@AfterThrowing("print()")public voidafterThrowing() {
System.out.println("afterThrowing 1 ......");
}
@AfterReturning("print()")public voidafterReturning() {
System.out.println("afterReturning 1 ......");
}
}
packagecom.ssm.chapter11.multi.aspect;import org.aspectj.lang.annotation.*;importorg.springframework.core.annotation.Order;/**************** imports ****************/@Aspect
@Order(2)public classAspect2 {
@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")public voidprint() {
}
@Before("print()")public voidbefore() {
System.out.println("before 2 ......");
}
@After("print()")public voidafter() {
System.out.println("after 2 ......");
}
@AfterThrowing("print()")public voidafterThrowing() {
System.out.println("afterThrowing 2 ......");
}
@AfterReturning("print()")public voidafterReturning() {
System.out.println("afterReturning 2 ......");
}
}
packagecom.ssm.chapter11.multi.aspect;import org.aspectj.lang.annotation.*;importorg.springframework.core.annotation.Order;/**************** imports ****************/@Aspect
@Order(3)public classAspect3 {
@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")public voidprint() {
}
@Before("print()")public voidbefore() {
System.out.println("before 3 ......");
}
@After("print()")public voidafter() {
System.out.println("after 3 ......");
}
@AfterThrowing("print()")public voidafterThrowing() {
System.out.println("afterThrowing 3 ......");
}
@AfterReturning("print()")public voidafterReturning() {
System.out.println("afterReturning 3 ......");
}
}
代码清单:多切面测试Java配置
packagecom.ssm.chapter11.multi.config;importcom.ssm.chapter11.multi.aspect.Aspect1;importcom.ssm.chapter11.multi.aspect.Aspect2;importcom.ssm.chapter11.multi.aspect.Aspect3;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.EnableAspectJAutoProxy;/****************imports****************/@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.ssm.chapter11.multi")public classMultiConfig {
@BeanpublicAspect1 getAspect1() {return newAspect1();
}
@BeanpublicAspect2 getAspect2() {return newAspect2();
}
@BeanpublicAspect3 getAspect3() {return newAspect3();
}
}
代码清单:测试
public static voidmain(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.