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、输出