spring 多个切面
2020-12-13 01:55
标签:如何 core scan ann contex after import frame execution Spring也能支持多个切面。当有多个切面时,它不会存在任何顺序,这些顺序代码会随机生成,但是有时候我们希望它按照指定的顺序运行。 代码清单:定义多个切面的切点方法 代码清单:测试 如何让它有序执行: spring 多个切面 标签:如何 core scan ann contex after import frame execution 原文地址:https://www.cnblogs.com/ooo0/p/11018870.html
在此之前要先定义一个切点方法,为此新建一个接口——MultiBeanpackage 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个切面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配置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();
}
}
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.