【Spring】AOP通知Around注解实现环绕通知
1、定义一个切面
//@Component //Aspect注解声明 Audience是一个切面 @Aspect public class Audience { //@Pointcut注解声明切点 @Pointcut("execution(* com.example.aroundaspectdemo.concert.Performance.perform(..))") public void performance() { } //@Around注解声明环绕通知的方法 @Around("performance()") public void watchPerformance(ProceedingJoinPoint jointPoint) { try { System.out.println("Silencing cell phones"); System.out.println("Task seats"); //jointPoint.proceed()方法时调用Performance接口的实现类中的perform()方法 //如果不写这一句,就不会调用,如果写多次就会调用多次 jointPoint.proceed(); // jointPoint.proceed(); System.out.println("CLAP CLAP CLAP"); } catch (Throwable e) { System.out.println("Demanding a refund"); } } }
2、定义Performance接口
package com.example.aroundaspectdemo.concert; public interface Performance { void perform(); }
3、定义Performance接口的实现类
package com.example.aroundaspectdemo.concert; import org.springframework.stereotype.Component; @Component public class LivingTheatrePerformance implements Performance { @Override public void perform() { System.out.println("我是舞台剧"); } }
4、启用AspectJ注解的自动代理
也可以省去这一步,直接在Audience类上加上Component注解
package com.example.aroundaspectdemo.concert; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; //@Configuration注解声明ConcertConfig是一个配置类 @Configuration //@EnableAspectJAutoProxy注解启动AspectJ自动代理 @EnableAspectJAutoProxy @ComponentScan public class ConcertConfig { //声明Audience bean @Bean public Audience audience() { return new Audience(); } }
5、调用
package com.example.aroundaspectdemo; import com.example.aroundaspectdemo.concert.LivingTheatrePerformance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class AroundaspectdemoApplication { @Autowired LivingTheatrePerformance livingTheatrePerformance; public static void main(String[] args) { System.out.println("main"); SpringApplication.run(AroundaspectdemoApplication.class, args); } @RequestMapping("/") public void Home(){ System.out.println("home"); livingTheatrePerformance.perform(); } }
6、输出