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

经验分享 程序员 微信小程序 职场和发展