SpringBoot应⽤AOP及各注解的执⾏顺序⾸先第⼀步,POM引⼊jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.3</version>
</dependency>
第⼆步随便写⼀个类,然后类中写⼀个⽅法,我这⾥是写了⼀个除法运算:
public class MathCalculator {
public int div (int i, int j) {
System.out.println("");
return i / j;
}
}
第三步写⼀个切⾯类:
//该注解表⽰声明该类为⼀个切⾯类
@Aspect
public class LogAspects {
//定义⼀个切点,表达式可以灵活运⽤,我这个表达式是表⽰MathCalculator类中所有的⽅法都进⾏切⼊
@Pointcut("execution(public ample.demo.aop.MathCalculator.*(..))")
public void pointCut () {}
//⽅法执⾏开始之前
@Before("pointCut()")
public void logStart (JoinPoint joinPoint) {
System.out.println("除法运⾏...参数:{"+ Arrays.Args())+"}");
}
//⽅法执⾏开始之后
@After("pointCut()")
public void logEnd (JoinPoint joinPoint) {
spring aop应用场景System.out.println("除法结束..." + Signature().getName());
}
//当⽅法进⾏返回的时候,returning属性是指定⽅法参数中的result来接收返回参数,这样就可以修改返回参数 @AfterReturning(value = "pointCut()", returning = "result")
public void logReturn (JoinPoint joinPoint, Object result) {
System.out.println("除法正常返回... 返回结果:{"+result+"}");
}
//当⽅法执⾏异常的时候,throwding是指定⽅法参数中的e来接收异常参数,可以查看发⽣的什么异常
@AfterThrowing(value = "pointCut()", throwing = "e")
public void logException (JoinPoint joinPoint, Exception e) {
System.out.println("异常... 异常信息:{"+e+"}");
}
//环绕通知
@Around("pointCut()")
public Object logAround (ProceedingJoinPoint joinPoint) throws Throwable {
//原⽅法执⾏之前会打印这个⽇志
System.out.println("环绕通知... 开始");
//执⾏原⽅法
Object obj = joinPoint.proceed();
//原⽅法执⾏结束,打印这⾏⽇志
System.out.println("环绕通知... 结束");
//返回⽅法返回参数
return obj;
}
}
这⾥要注意⼀下AOP注解执⾏的先后顺序
环绕通知... 开始
除法运⾏...参数:{[1, 1]}
环绕通知... 结束
除法结束...div
除法正常返回... 返回结果:{1}
运⾏的顺序是
1、@Around
2、@Before
3、原⽅法
4、@Around
5、@After
6、@AfterReturning
第四步,写⼀个配置类,记得⼀定要加@EnableAspectJAutoProxy注解
//该配置类是为了将我们前2个类(切⾯类、被切⾯类)加⼊到Spring容器中
@Configuration
//启动AOP(⼀定要加这个注解,切记)
@EnableAspectJAutoProxy
public class SpringOfAOPConfig {
@Bean
public MathCalculator mathCalculator () {
return new MathCalculator();
}
@Bean
public LogAspects logAspects () {
return new LogAspects();
}
}
第五步,测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Test
public void contextLoads() {
//根据配置类获取SPring容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringOfAOPConfig.class); //从容器中获取Bean
MathCalculator mathCalculator = Bean(MathCalculator.class);
//执⾏除法运算
mathCalculator.div(1, 1);
//关闭容器
applicationContext.close();
}
}
正常结果:
2018-12-11 11:01:25.496 INFO 16364 --- [ main] ample.demo.DemoApplicationTests : Started DemoApplicationTests in 3.455 seconds (J 环绕通知... 开始
除法运⾏...参数:{[1, 1]}
环绕通知... 结束
除法结束...div
除法正常返回... 返回结果:{1}
2018-12-11 11:01:25.807 INFO 16364 --- [ Thread-2] o.urrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'异常结果:
2018-12-11 11:11:22.205 INFO 9628 --- [ main] ample.demo.DemoApplicationTests : St
arted DemoApplicationTests in 3.532 seconds (JV 环绕通知... 开始
除法运⾏...参数:{[1, 0]}
除法结束...div
异常... 异常信息:{java.lang.ArithmeticException: / by zero}
java.lang.ArithmeticException: / by zero
看到没:
当发⽣异常的时候@Around的⽅法执⾏后切⼊没有进⾏,但是@After的⽅法却执⾏了,所以原⽅法发⽣异常后顺序就是
1、@Around
2、@Brfore
3、原⽅法
4、@After
5、@AfterThrowing
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论