SpringBoot 개발 수기 -- AOP 사용

5426 단어
SpringBoot 개발 수기 -- AOP 사용
Aop 원리
  • 1. Aop 이 무엇 입 니까
  • 2. Aop 상용 용어
  • 3. AOP 표현 식
  • 4. AOP 알림 유형
  • 5. 동적 에이전트, 정적 에이전트 참조
  • 1. Aop 이란 무엇 인가
    op 는 모두 Aspect Oriented Programming 이 라 고 하 는데 절단면 을 대상 으로 AOP 는 주로 업무 처리 과정 에서 의 절단면 을 추출 하 는 것 이 목적 이다. 이 는 처리 과정 에서 의 특정한 절차 나 단계 에 직면 하여 논리 과정 에서 각 부분 간 의 낮은 결합 성의 격 리 효 과 를 얻 는 것 이다.디자인 모델 이 완성 한 임무 와 차이 가 많 지 않 고 다른 측면 에서 프로그램의 구 조 를 생각 하여 대상 을 대상 으로 하 는 프로 그래 밍 의 부족 을 보완 하 는 것 이다.
    AOP 기술 은 '가로 자 르 기' 라 는 기술 을 이용 하여 봉 인 된 대상 내 부 를 해부 하고 여러 가지 유형의 공공 행 위 를 재 활용 가능 한 모듈 로 봉 하면 시스템 의 중복 코드 를 줄 이 고 모듈 간 의 결합 도 를 낮 추 며 미래의 조작 성과 유지 가능성 에 유리 하 다.AOP 는 소프트웨어 시스템 을 두 부분 으로 나 누 었 다. 핵심 관심 사 와 횡단 관심 사 이다.업무 처리 의 주요 절 차 는 핵심 관심 사 이 고 그 와 의 관계 가 크 지 않 은 부분 은 횡단 관심 사다.횡단 관심 점 의 특징 중 하 나 는 그들 이 핵심 관심 점 의 여러 곳 에서 자주 발생 하 는데 곳곳 이 기본적으로 비슷 하 다 는 것 이다.예 를 들 어 권한 인증, 로그, 사무 처리 등 입 니 다.
    2. AOP 상용 용어
  • 절단면 Aspect - - 보통 하나의 유형 으로 그 안에 접점 과 관심 사 를 알려 주 는 모듈 화 를 정의 할 수 있 습 니 다. 이 관심 사 는 여러 대상 을 가로로 자 를 수 있 습 니 다.사무 관 리 는 J2EE 응용 프로그램 에서 횡단 관심 사 에 관 한 좋 은 예 이다.Spring AOP 에서 절단면 은 패턴 기반 또는 @ Aspect 주석 기반 으로 이 루어 집 니 다.
  • 연결 점 Joinpoint 는 프로그램 실행 과정 에서 특정한 점, 예 를 들 어 특정한 방법 이 호출 될 때 나 이상 을 처리 할 때.Spring AOP 에서 하나의 연결 점 은 항상 하나의 방법의 실행 을 나타 낸다.
  • Advice 가 절단면 의 특정한 연결 점 에서 수행 하 는 동작 을 알려 줍 니 다.'around', 'before', 'after' 등 다양한 유형의 알림 (알림 의 유형 은 뒷부분 에서 토론 합 니 다) 이 포함 되 어 있 습 니 다.많은 AOP 프레임 워 크 (Spring 포함) 는 차단기 로 알림 모델 을 만 들 고 연결 점 을 중심 으로 하 는 차단기 체인
  • 을 유지 합 니 다.
  • 접점 Pointcut 이 연결 점 과 일치 하 는 단언 입 니 다.알림 은 접점 표현 식 과 연결 되 어 있 으 며, 이 접점 을 만족 시 키 는 연결 점 에서 실 행 됩 니 다 (예 를 들 어 특정한 이름 을 실행 하 는 방법 을 실행 할 때).접점 표현 식 이 연결 점 과 어떻게 일치 하 는 지 는 AOP 의 핵심 입 니 다. Spring 결 성 은 AspectJ 접점 문법 을 사용 합 니 다.
  • introduction 을 도입 하여 하나의 유형 에 추가 적 인 방법 이나 속성 을 설명 합 니 다 (연결 형식 성명 (inter - type declaration) 이 라 고도 합 니 다.Spring 은 대리 대상 에 새로운 인터페이스 (및 대응 하 는 실현) 를 도입 할 수 있 습 니 다.예 를 들 어, 캐 시 메커니즘 을 간소화 하기 위해 bean 을 IsModified 인 터 페 이 스 를 도입 할 수 있 습 니 다.
  • * * 대상 대상 Target Object * * 한 개 또는 여러 개의 절단면 에 통 지 된 대상.알림 대상 이 라 고도 합 니 다.Spring AOP 가 실 행 될 때 대 리 를 통 해 이 루어 진 이상 이 대상 은 영원히 대리 (proxied) 대상 이다.
  • Aop 대리 AOP 프레임 워 크 가 만 든 대상 은 절단면 계약 (예 를 들 어 알림 방법 집행 등) 을 실현 하 는 데 사용 된다.Spring 에서 AOP 에이 전 트 는 JDK 동적 에이전트 나 CGLIB 에이전트 가 될 수 있다.
  • Weaving 을 짜 서 다른 프로그램 형식 이나 대상 에 절단면 을 연결 하고 알려 진 대상 을 만 듭 니 다.이것 은 컴 파일 할 때 (예 를 들 어 AspectJ 컴 파일 러 사용) 클래스 로 딩 할 때 와 실행 할 때 완성 할 수 있 습 니 다.Spring 은 다른 순수 자바 AOP 프레임 워 크 와 마찬가지 로 실행 중 직 입 이 완료 되 었 습 니 다.

  • 3. AOP 표현 식 문법
  • 표현 식 예시: execution (* com. package.. *. * (..)
  • 식별 자
    속뜻
    execution()
    표현 식 의 주체
    첫 번 째 "*" 기호
    반환 값 을 나타 내 는 형식 임 의
    com.package
    AOP 가 자 른 서비스의 가방 이름, 즉 가로로 자 르 는 업무 류 가 필요 합 니 다.
    가방 이름 뒤에 '...'
    가방
    두 번 째 "*"
    모든 클래스
    .*(..)
    모든 방법 명 을 표시 하고 괄호 는 파 라 메 터 를 표시 하 며 두 점 은 모든 매개 변수 유형 을 표시 합 니 다.
    차원 별 설명
  • 주 해 를 통 해 접점 정의
  • @ annotation (주석 경로)
  • 방법 수식 자 를 통 해 접점 정의
  • 모든 Public 수정자 와 일치 하 는 방법:
  • execution(public * *(..))
  • 방법 명 을 통 해 접점 정의
  • 모든 "set" 시작 과 일치 하 는 방법:
  • execution(* set*(..))
  • 클래스 정의 접점
  • AccountService 인터페이스 와 일치 하 는 모든 방법:
  • execution(* com.xyz.service.AccountService.*(..))
  • 가방 을 통 해 접점 정의
  • 서비스 패키지 의 모든 클래스 와 일치 하 는 방법:
  • execution(* com.xyz.service.*(..))

  • service 패키지 와 하위 패키지 의 모든 방법 에 일치 합 니 다:
  • execution(* com.xyz.service..*(..))

  • 4. AOP 알림 유형
    1. Before: 대상 방법 이 호출 되 기 전에 강화 처 리 를 합 니 다. @ Before 는 접점 표현 식 만 지정 하면 됩 니 다.
    2. AfterReturning: 목표 방법 이 정상적으로 완 성 된 후에 강화 합 니 다. @ AfterReturning 은 접점 표현 식 을 지정 한 후에 반환 값 형 참 명 returning 을 지정 하여 목표 방법 을 나타 내 는 반환 값 을 지정 할 수 있 습 니 다.
    3. AfterThrowing: 프로그램 에서 처리 되 지 않 은 이상 을 처리 하 는 데 사 용 됩 니 다. @ AfterThrowing 은 삽입점 표현 식 을 지정 한 후 throwing 의 반환 값 형 참 명 을 지정 할 수 있 습 니 다. 이 형 참 명 을 통 해 대상 방법 에서 던 진 이상 대상 에 접근 할 수 있 습 니 다.
    4. After: 목표 방법 이 완 성 된 후에 강화 합 니 다. 목표 방법 에 관 계 없 이 성공 적 으로 완성 합 니 다. @After 는 절 입 점 표현 식 을 지정 할 수 있 습 니 다.
    5. Around: 서 라운드 알림 은 목표 방법 이 완 료 된 후에 강화 처 리 를 합 니 다. 서 라운드 알림 은 가장 중요 한 알림 유형 입 니 다. 예 를 들 어 사무, 로그 등 은 모두 서 라운드 알림 입 니 다. 프로 그래 밍 의 핵심 은 Proceeding JoinPoint 입 니 다.
    코드 시범
    
    @Component
    @Aspect
    public class AOPTest {
    
    
       /**
        *        
        */
       @Pointcut("execution(* cn.hhu..bbs..*.*(..))")
       public void pointcut1(){}
    
       @Before("pointcut1()")
       public void before(JoinPoint joinPoint){
    
           System.out.println("before");
       }
       @After("pointcut1()")
       public void after(JoinPoint joinPoint){
           System.out.println("after");
    
       }
       @AfterReturning(pointcut = "pointcut1()",returning = "returnVal")
       public void afterReturning(JoinPoint joinPoint,Object returnVal){
    
           System.out.println("afterReturning:result+"+returnVal);
    
       }
    
       @Around("pointcut1()")
       public void around(ProceedingJoinPoint proceedingJoinPoint){
           System.out.println("around  ");
           try {
               proceedingJoinPoint.proceed();
           } catch (Throwable throwable) {
               throwable.printStackTrace();
           }
           System.out.println("around ");
       }
    }
    
    around  
    before
         
    around 
    after
    afterReturning:result+null
    

    여기 AfterReturing 의 반환 값 이 null 인 것 은 서 라운드 알림 이 존재 하기 때문에 서 라운드 알림 없 이 반환 값 을 찾 을 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기