>  기사  >  Java  >  SpringBoot 프로젝트에서 aop를 사용하는 방법

SpringBoot 프로젝트에서 aop를 사용하는 방법

王林
王林앞으로
2023-05-11 15:04:131607검색

머리말

IOC와 AOP는 Spring의 두 가지 핵심 개념입니다. 제가 이해한 바를 간략하게 소개하겠습니다.

IOC: 제어 역전이란 수동으로 객체를 생성하는 과정을 Spring에 넘겨주는 것을 의미합니다. , 개체 및 개체 간의 종속성을 관리합니다. 이는 코드의 결합을 줄이고 프로젝트의 향후 유지 관리를 용이하게 합니다. 간단한 예를 들어보겠습니다.
일반적인 상황에서 우리는 집에 있고, 배가 고프고, 스스로 요리를 합니다.
IOC를 이용할 때 집에 있을 때 배가 고프면 상인에게 전화를 하면 음식이 배달됩니다.
IOC는 상인에 해당하고, 요리는 물건을 만드는 것과 같습니다.
즉, 일반적인 상황에서 클래스가 다른 클래스의 메서드를 호출해야 할 때 new, 팩토리 또는 기타 메서드를 통해 수동으로 개체를 생성합니다.
IOC를 사용할 때는 객체만 주입하면 됩니다.

AOP: 특정 유형의 객체를 감독하고 제어할 수 있는 측면 지향(편리한) 프로그래밍. 이러한 유형의 객체에 대한 메서드 호출 전후에 지정된 코드를 호출하여 메서드를 확장하여 향상된 효과를 얻습니다. 모듈 기능. 간단한 예를 들면:
일반적인 상황에서는 직접 먹습니다.
AOP를 이용하면 보모가 지켜보면서 식사 전 손 씻기, 식사 후 설거지까지 도와줍니다.
AOP는 보모와 같고, 먹는 것은 특정 메서드를 호출하는 것과 같습니다.
즉, 메소드를 보완하고 싶을 때 메소드를 직접 수정하지 않고 AOP를 통해 보완하는 것입니다. 보충을 원하지 않거나 보충을 교체해야 할 경우 AOP를 직접 운영할 수 있습니다.
1. Pointcut: 실행 등 어떤 메소드를 차단할지 정의하는 데 사용됩니다(* cn.springcamp.springaop.service..(…))

2.

3. Aspect, Pointcut과 Advice를 결합하여 Aspect를 구성합니다

4. Join Point: 실행 중 Pointcut의 인스턴스

4. AspectJ 또는 Spring AOP와 같은 AOP를 구현하는 프레임워크

一, SpringBoot 프로젝트는 AOP 종속성

<!--aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

Startup 클래스와 생략 가능한 @EnableAspectJAutoProxy 주석을 도입합니다. AOP의 기본 구성 속성에서는 spring.aop.auto 속성이 기본적으로 켜져 있기 때문입니다.
더 이상 AspectJ 종속성을 도입할 필요가 없습니다.

2. 일반 메소드

Aspect 클래스 코드:

package com.example.myblog.test;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AOPTest {
    //定义切入点
    @Pointcut("execution(public * com.example.myblog.test.AOPTestClient.*(..))")
    public void aspectTest(){}

    //前置通知,切入点执行之前执行
    @Before("aspectTest()")
    public void doBefore(JoinPoint joinPoint){
        System.out.println("前置通知");
    }
    //后置通知,切入点执行之后执行
    @After("aspectTest()")
    public void doAfter(JoinPoint joinPoint){
        System.out.println("后置通知");
    }
    //最终通知,,切入点执行之后执行
    @AfterReturning("aspectTest()")
    public void doAfterReturning(JoinPoint joinPoint){
        System.out.println("最终通知");
    }
    //异常通知,切入点抛出异常执行
    @AfterThrowing("aspectTest()")
    public void deAfterThrowing(JoinPoint joinPoint){
        System.out.println("异常通知");
    }
    //环绕通知,切入点执行前、后执行
    @Around("aspectTest()")
    public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("未执行");
        Object result = joinPoint.proceed();
        System.out.println("已执行");
        //返回结果
        return result;
    }
}

Pointcut 클래스 코드:

package com.example.myblog.test;

import org.springframework.stereotype.Component;

@Component
public class AOPTestClient {
    public void test(){
        System.out.println("正在测试AOP");
    }
}

테스트 클래스 코드:

package com.example.myblog;

import com.example.myblog.test.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class MyblogApplicationTests {
    
    @Autowired
    private AOPTestClient aopTestClient;

    @Test
    public void testAOP(){
        aopTestClient.test();
    }
}

테스트 결과:

SpringBoot 프로젝트에서 aop를 사용하는 방법

3. 커스텀 어노테이션 코드:

package com.example.myblog.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//表示次注解可以标注在类和方法上
@Target({ElementType.METHOD, ElementType.TYPE})
//运行时生效
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    //定义一个变量,可以接受参数
    String desc() default " ";
}

Aspect 클래스 코드:

package com.example.myblog.test;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AOPAnnotationTest {
    //定义切入点
    @Pointcut("@annotation(com.example.myblog.test.MyAnnotation)")
    public void aspectTest(){}

    //前置通知,切入点执行之前执行
    @Before("aspectTest()")
    public void doBefore(JoinPoint joinPoint){
        System.out.println("前置通知");
    }
    //后置通知,切入点执行之后执行
    @After("aspectTest()")
    public void doAfter(JoinPoint joinPoint){
        System.out.println("后置通知");
    }
    //最终通知,,切入点执行之后执行
    @AfterReturning("aspectTest()")
    public void doAfterReturning(JoinPoint joinPoint){
        System.out.println("最终通知");
    }
    //异常通知,切入点抛出异常执行
    @AfterThrowing("aspectTest()")
    public void deAfterThrowing(JoinPoint joinPoint){
        System.out.println("异常通知");
    }
    //环绕通知,切入点执行前、后执行
    @Around("aspectTest()")
    public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("未执行");
        Object result = joinPoint.proceed();
        System.out.println("已执行");
        //返回结果
        return result;
    }
}

Pointcut 클래스 코드:

package com.example.myblog.test;

import org.springframework.stereotype.Component;

@Component
public class AOPAnnotationTestClient {
    @MyAnnotation
    public void test(){
        System.out.println("正在测试AOP");
    }
}

테스트 클래스 코드:

@Test
    public void testAOPAnnotation(){
        aopAnnotationTestClient.test();
    }

테스트 결과:

위 내용은 SpringBoot 프로젝트에서 aop를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제