Spring AOP 的简单实例

64 阅读1分钟

Spring Boot 的 AOP 的简单实现

Spring Boot 工程的依赖

    <dependencies>
      	<!--引入 spring Boot 的基本依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
      	<!--引入 spring Boot 的测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--引入AOP依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
		</dependencies>

完成一个切面类

package com.example.spring_aop.aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @className:Logger
 * @Description 切面类
 * @Author: ckyfoever
 * @Date: 2022/3/29 13:51
 */
@Aspect
@Component
public class Logger {
  	// 设置切入点
  	// 本文设置的切入点为 com.example.spring_aop.service 包下的所有类的所有函数
    @Pointcut("execution(* com.example.spring_aop.service..*.*(..))")
    public void pointCut() {
    }
  	
    @Before("pointCut()")
  	//前置通知, 在方法执行之前执行
    public void before() {
        System.out.println("before");
    }

    @After("pointCut()")
  	//后置通知, 在方法执行之后执行
    public void after() {
        System.out.println("after");
    }
}

完成 service 类的写(由于是简单实例 本文的 service 也简单)

package com.example.spring_aop.service;

import org.springframework.stereotype.Service;

/**
 * @className:HelloWorld
 * @Description service 类
 * @Author: ckyfoever
 * @Date: 2022/3/29 13:51
 */
@Service
public class HelloWorld {
  	// service 方法
    public void sayHello(){
        System.out.println("Hello World!");
    }
}

编写测试类

package com.example.spring_aop;

import com.example.spring_aop.service.HelloWorld;
import org.junit.jupiter.api.Test;
import org.omg.CORBA.CTX_RESTRICT_SCOPE;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;

@SpringBootTest
class SpringAopApplicationTests {

    @Test
    void contextLoads() {
    }


    @Test
    void testAspect() {
      	//获取 spring boot 的上下文
        ApplicationContext context = SpringApplication.run(SpringAopApplication.class);
      	//从 spring 中获取 
        HelloWorld helloWorld = context.getBean(HelloWorld.class);
        for (int i = 0; i < 10; i++) {
            helloWorld.sayHello();
        }
    }

}

输出结果

image-20220329143044826