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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值