AOP 및 Spring AOP 소개

13295 단어 springcoreaop

1.AOP이란?
위키백과를 찾는 시간을 절약하기 위해 다음과 같은 정의를 내렸다.

aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a “pointcut” specification, such as “log all function calls when the function’s name begins with ‘set’ ”.


만약 당신이 이 정의를 이해하지 못한다면, 걱정하지 말고 전체 문장을 통독하면, 이 정의의 모든 개념에 해석이 있다는 것을 발견할 수 있을 것이다.
나에게 있어서 AOP는 시스템 범위를 봉인하는 관심사나 횡단 관심점(전체 시스템에 적용되고 전체 시스템에 영향을 주는 관심점)이다.로그 기록, 안전성, 데이터 전송은 시스템의 거의 모든 부분에서 고려해야 할 문제이다.AOP은 이 모든 교차 관심사를 방면이라고 불리는 것에 봉인한다.
Spring은 AOP을 내부적으로 사용하는 경우가 많습니다.정확한 AOP의 이해가 없었다면 스프링 프레임이 엔진 뚜껑 아래에서 무엇을 했는지 이해할 수 없었을 것이다.

2. AOP이 해결한 문제
AOP은 이러한 주요 문제 중 하나(또는 내가 언급하지 않은 다른 문제들을 간결하게 보기 위해)에 직면했을 때 정말 유용하다.
  • 가로 접점 캡슐화
  • 코드의 긴밀한 결합 의존항을 추출하여 방면으로 이동
  • 하여 코드의 긴밀한 결합 의존항에 대항할 수 있습니다
  • 여러 곳에서 코드를 반복하지 않도록 도와줍니다.모든 데이터베이스 방법에 적용되는 로그 프로세스를 작성하려면 필요할 때마다 이 코드 블록을 복사하고 붙여야 한다고 상상해 보세요.따라서 건조 원칙에 어긋난다(중복하지 마라).따라서 코드 중복 제거
  • AOP을 활용하여 어플리케이션 논리를 매우 간결한 형식으로 유지 관리하여 읽기 및 서비스 용이성을 향상시킬 수 있음
  • 내가 만난 가장 흔히 볼 수 있는 용례는 사무 관리, 로그 기록, 캐시이다. 물론 안전성은 사용에 좋은 곳이다.
  • 등...

  • 3. AOP 개념
    이것들은 AOP 배후의 주요 개념들이다.이러한 용어는 Spring에만 해당되지 않습니다.
    방면: 여러 종류의 관심사를 뛰어넘는 모듈화.그것은 실행할 때 시스템에 다시 사용할 수 있는 코드 블록을 주입한다.시스템 범위의 로그 기록은 이런 교차 관심의 한 예가 될 수 있다.
    연결점: 시스템의 코드 점으로 이 점을 대상으로 실행됩니다.이것들은 건의를 응용하는 방법이다.
    삽입점: 삽입점 표현식은 어떤 표현식이 일치해서 연결점을 표시합니다.
    권장: 이것은 삽입점에서 선택한 연결점에서 실행되는 코드 블록입니다.그래서 이것은 우리가 시스템에서 하나의 연결점에 응용하는 횡단 관심점 방법이다.
    목표 대상: 여러 방면에서 건의한 대상.
    AOP 에이전트: AOP 프레임워크에서 만든 객체입니다.에이전트는 AOP 프레임워크에 도입된 중간 대상이며 호출 대상과 목표 대상 사이에 있다.

    4.봄AOP
    Spring AOP은 에이전트 기반입니다.Spring은 JDK 에이전트(기본값) 또는 CGLIB 에이전트를 사용하여 지정된 대상 bean에 대한 에이전트를 만듭니다.실행할 때 에이전트는 목표 대상에 대한 호출을 차단하고 목표 방법에 대한 건의를 실행합니다.
    Spring AOP에서 대상 객체는 Spring 컨테이너에 등록된 bean 인스턴스입니다.
    권장 실행 시간은 권장 유형에 따라 달라집니다.AspectJ 주석 스타일에서 공지의 유형은 공지의 AspectJ 주석에 의해 지정됩니다.예를 들어 AspectJ의 @Before 주석은 목표 방법을 호출하기 전에 제안을 실행하고 @After 주석은 목표 방법을 호출한 후에 제안을 실행하고 @Around 주석은 목표 방법을 실행하기 전과 이후에 제안을 실행하는 것을 지정합니다.

    5. 예제 프레젠테이션
    이 간단한 예제에서 Spring AOP을 사용하여 로그 비헤이비어를CustomerAccountDAO에 추가하는 방법**
    다음은 CustomerAccountDAO의 모습입니다(참고, 이 방법은 @Loggable 주석을 사용하고 삽입점 표현식에서 @Loggable 주석을 사용합니다).
    package com.example.dao;
    
    import com.example.aspect.Loggable;
    import com.example.domain.BankAccountDetails;
    import org.springframework.stereotype.Component;
    
    @Component
    public class CustomerAccountDAO {
    
        @Loggable
        public void createBankAccount(BankAccountDetails bankAccountDetails) {
            // database operation
        }
    
        @Loggable
        public void subtractFromAccount(int bankAccountId, int amount) {
            // database operation
        }
    }
    
    AspectJ 주석 스타일을 사용하여 방면을 만들려면 *@enable SpectToProxy 주석 config 클래스를 사용하여 AspectJ 주석 스타일을 사용하는 지원을 사용해야 합니다 *또한 요소는 Spring AOP 프레임워크에 대상 객체에 대한 AOP 프록시를 자동으로 작성하도록 지시합니다.
    @Configuration
    @EnableAspectJAutoProxy
    @ComponentScan("com.example.*")
    public class Config {
    
    }
    
    로그 비헤이비어를 추가하기 위해 다음과 같은 영역을 정의했습니다.
    package com.example.aspect;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    
    @Aspect
    @Component
    public class LoggingAspect {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class);
    
        @Before("@annotation(Loggable)")
        public void logMethodCall(JoinPoint joinPoint) {
            StringBuilder message = new StringBuilder("Method: ");
            message.append(joinPoint.getSignature().getName());
            Object[] args = joinPoint.getArgs();
            if (args != null && args.length > 0) {
                message.append("args=[");
                Arrays.asList(args).forEach(arg -> message.append("args=").append(arg));
            }
            message.append("]");
            LOGGER.info(message.toString());
        }
    }
    
    AspectJ의 @Before 주석은 대상 메서드를 호출하기 전에 알림을 실행하도록 지정합니다.이것은 연결점을 표시하는 삽입점 표현식에 매개 변수를 제공합니다.이 연결점은 @Loggable 주석을 사용하는 모든 방법입니다. 이것은 제가 정의한 사용자 정의 주석입니다.
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Loggable {
    
    }
    
    이것은customerAccountDAO의createBankAccount 방법과customerAccountDAO의subtractFromAccount를 호출하는 주요 종류입니다.
    package com.example;
    
    import com.example.dao.CustomerAccountDAO;
    import com.example.domain.BankAccountDetails;
    import config.Config;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
    
            ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
            CustomerAccountDAO customerAccountDAO = context.getBean(CustomerAccountDAO.class);
    
            customerAccountDAO.createBankAccount(new BankAccountDetails(10, 20_000));
            customerAccountDAO.subtractFromAccount(10, 1_000);
    
        }
    
    }
    
    프로그램의main 방법을 실행하면, 컨트롤러에서 이 방법들이 적용되고 있는 것을 볼 수 있습니다.
    출력:
    INFO  com.example.aspect.LoggingAspect - Method: createBankAccountargs=[args=BankAccountDetails{accountId=10, balanceAmount=20000}]
    INFO  com.example.aspect.LoggingAspect - Method: subtractFromAccountargs=[args=10args=1000]
    

    결론
    이 문서에서 나는 측면 프로그래밍의 개념을 설명하고 Spring 프레임워크와의 관계를 소개하고자 한다.
    너는 이 Github repository 에서 프레젠테이션 코드를 얻을 수 있다.이것은 Maven 기반 프로젝트이기 때문에 쉽게 가져오고 그대로 실행될 것입니다.
    아래의 댓글에서 당신의 생각을 알려주세요. 공유하는 것을 잊지 마세요!

    좋은 웹페이지 즐겨찾기