wannaqueen
  • Initial page
  • Spring boot
    • 스프링부트의 소개
      • 8. 스프링 부트 소개 by ks
      • 9. 시스템 요구사항 by ks
      • 10. 스프링 부트 설치 by ks
      • 11. 첫 번째 Spring Boot 애플리케이션 개발하기 by ys
        • 11.1 POM 만들기
        • 11.2 클래스 패스 의존성 추가하기
        • 11.3 코드 작성하기
        • 11.4 예제 실행하기
        • 11.5 실행 가능한 jar 만들기
      • 12. 다음에 읽을 내용 by ys
      • 13. 빌드 시스템 by sh
        • 13.1 의존성 관리
        • 13.2 Maven
        • 13.3 Gradle
        • 13.4 Ant
        • 13.5 Starters
    • 스프링부트의 기능
      • 23. Spring Application by ys
        • 23.1 startup 실패
        • 23.2 배너를 내가 원하는 대로 바꾸기
        • 23.3 SpringApplication 커스터마이징하기
        • 23.4 Fluent Builder API
        • 23.5 어플리케이션 이벤트와 리스너들
        • 23.6 웹 환경
        • 23.7 Application 인자에 접근하기
        • 23.8 ApplicationRunner 또는 CommandLineRunner 사용
        • 23.9 어플리케이션 종료
        • 23.10 관리자 기능
      • 24. 외부화된 구성 by ys
        • 24.1 임의의 값 구성
        • 24.2 명령행 특성 액세스
        • 24.3 응용 프로그램 속성 파일
        • 24.4 프로파일 관련 프라퍼티들
        • 24.5 프라퍼티들에서 플레이스홀더들
        • 24.6 속성의 암호화
        • 24.7 속성대신 yaml 사용하기 - 다시
        • 24.8 Type-safe Configuration Properties
      • 25. 프로파일 by ks
        • 25.1 Active 프로파일 더하기
        • 25.2 프로그램적으로 프로파일 세팅
        • 25.3 프로파일 별 구성파일
      • 26. 로깅 by ks
        • 26.1 로그 형식
        • 26.2 콘솔 출력
        • 26.3 파일 출력
        • 26.4 로거 레벨
        • 26.5 로그 그룹
        • 26.6 사용자 정의 로그 설정
        • 26.7 로그백 확장
      • 27 국제화 by ks
      • 28. SQL 데이터베이스 작업 by sh
      • 29. NoSQL 기술 사용 by sh
      • 30. 메시징 by sh
      • 31. 이메일 전송 by sh
      • 28. JSON by sh (다시 시작!)
        • 28.1 Jackson
        • 28.2 Gson
        • 28.3 JSON-B
      • 29. 웹 응용 프로그램 개발 by sh
        • 29.1 The “Spring Web MVC Framework”
        • 29.2 The “Spring WebFlux Framework”
        • 29.3 JAX-RS and Jersey
        • 29.4 내장된 서블릿 컨테이너 지원
        • 29.5 내장된 반응형 서버 지원
        • 29.6 반응형 서버 리소스 구성
      • 30. Security by ys
        • 30.1 MVC 보안
        • 30.2 WebFlux 보안
        • 30.3 OAuth2
        • 30.4 Actuator 보안
      • 31. SQL 데이터베이스 작업 by ys
        • 31.1 Configure a DataSource
        • 31.2 JdbcTemplate 사용
        • 31.3 JPA와 스프링 데이터 JPA
        • 31.4 스프링 데이터 JDBC
        • 31.5 H2의 웹 콘솔 사용
        • 31.6 jOOQ 사용하기
      • 32. NoSQL 기술로 작업하기 by ks
      • 33 Caching by ks
      • 34. 메시징
        • 34.1 JMS by sh
        • 34.2 AMQP by sh
        • 34.3 Apache Kafka Support by ys
      • 35.REST 서비스 호출 RestTemplate
        • 35.1 RestTemplate 사용자 정의
      • 36. REST 서비스 호출 WebClient by ys
      • 37. 유효성 확인 by ys
      • 38. 이메일 보내기 by ys
      • 39. JTA를 이용한 분산 트랜잭션 by ys
      • 40.하젤캐스트(Hazelcast) by ys
      • 41. Quartz Scheduler by ys
      • 42. 작업 실행 및 스케줄링 by ys
      • 43. 스프링 통합 by ys
      • 44. Spring 세션 by ys
      • 45. JMX를 통한 모니터링 및 관리 by ys
      • 46. Testing by sh
        • 46.3 Testing Spring Boot Applications
          • 46.1~46.3.10
          • 46.3.11 자동 구성된 Spring WebFlux 테스트
          • 46.3.12 자동 구성된 Data JPA 테스트들
          • 46.3.13 자동 구성된 JDBC 테스트들
          • 46.3.14 자동 구성된 Data JDBC 테스트들
          • 46.3.15 자동 구성된 JOOQ 테스트들
          • 46.3.16 자동 구성된 Data MongoDB 테스트들
          • 46.3.17 자동 구성된 Data Neo4j 테스트
          • 46.3.18 자동 구성된 Data Redis 테스트들
          • 46.3.19 자동 구성된 Data LDAP 테스트들
          • 46.3.20 자동 구성된 REST 클라이언트
          • 46.3.21자동 구성된 Spring REST Docs 테스트
          • 46.3.22 추가적인 자동 구성 및 슬라이스
          • 46.3.23 사용자 구성 및 분할
          • 46.3.24 Spock을 사용하여 스프링 부팅 응용 프로그램 테스트
      • 47. 웹 소켓 by sh
      • 48. 웹 서비스 by sh
        • 48.1WebServiceTemplate로 웹 서비스 호출하기
      • 49. 자신만의 자동 구성 생성
        • 49.1 자동 구성된 빈 이해하기 by sh
        • 49.2 자동 구성 후보 찾기 by sh
        • 49.3 Condition 어노테이션들 by sh
        • 49.4 자동구성 테스팅 by ks
        • 49.5 자신만의 스타터 생성하기 by ks
      • 50. Kotlin support by ys
      • 51. What to Read Next by ys
      • 52. Production-ready 기능 활성화 by ys
      • 53. Endpoints
        • 53.1 엔드 포인트 활성화 by ys
        • 53.2 엔드 포인트 노출 by ys
        • 53.3 HTTP endpoints 보안 by ys
        • 53.4 Endpoints 구성
        • 53.5 액츄에이터 웹 엔드 포인트 용 하이퍼 미디어 by ys
        • 53.6 CORS 지원 by ys
        • 53.7 커스텀 엔드포인트 확장 by ks
        • 53.8 Health 정보 by ks
        • 53.9 어플리케이션 정보 by sh
      • 54. HTTP를 통한 모니터링 및 관리 by sh
        • 54.1 관리 엔드 포인트 경로 사용자 정의
        • 54.2 관리 서버 포트 사용자 정의
        • 54.3 관리 관련 SSL 구성
        • 54.4 관리 서버 주소 사용자 정의
        • 54.5 HTTP 끝점 사용안하기
  • spring 5.0
    • 1. IoC 컨테이너
      • 1.1 스프링 IoC 컨테이너와 빈의 도입 by sh
      • 1.2 컨테이너 by ys
      • 1.3 빈 개요 by ks
      • 1.4 의존성 by ks, ys, sh
        • 1.4.1 의존성 주입 by ks
        • 1.4.2 의존성과 configuration by ks
        • 1.4.3 depends-on 사용 by ys
        • 1.4.4 게으른-초기화된 bean by ys
        • 1.4.5 Autowiring Collaborators by ys
        • 1.4.6 메소드 주입 by sh
      • 1.5. 빈의 범위 by sh
      • 1.6 빈의 특성 커스터마이징하기 by ys
        • 1.6.1 라이프 사이클 콜백
        • 1.6.2 ApplicationContextAware과BeanNameAware
        • 1.6.3 기타 Aware인터페이스
      • 1.7 빈 정의 상속by ys
        • 1.7.1 빈 정의 상속
      • 1.8 컨테이너 확장 포인트 by ks
      • 1.9 어노테이션 기반의 컨테이너 구성 by sh
      • 1.10 클래스패스 스캔 및 관리 by ys
        • 1.10.1 @Component 및 추가 스테레오 타입 어노테이션
        • 1.10.2 meta-annotation 및 composed annotation 사용
        • 1.10.3 자동으로 클래스 검색 및 Bean 정의 등록
        • 1.10.4 스캐닝을 커스터마이징 하기위해 필터를 사용
        • 1.10.5 component 내에 Bean 메타 데이터 정의
        • 1.10.6 이름으로 자동탐지되는 컴포넌트
        • 1.10.7 범위로 자동 감지되는 컴포넌트
        • 1.10.8 annotation과 함께 한정된 메타데이터 제공
        • 1.10.9 후보 component의 index 생성
      • 1.11 JSR 330 표준 어노테이션 사용하기 by sh
      • 1.12 자바 기반의 컨테이너 구성 by sh, ks
        • 1.12.1 기본 개념: @Bean 및 @Configuration by sh
        • 1.12.2 AnnotationConfigApplicationContext를 사용한 스프링 컨테이너 인스턴스화 by sh
        • 1.12.3 @Bean 사용 by ks
        • 1.12.4 @Configuration 어노테이션 by ks
        • 1.12.5 자바 기반 Configuration구성 by ks
      • 1.13 환경 추상화 by ys
        • 1.13.1 빈 정의 프로파일
        • 1.13.2 PropertySource추출
        • 1.13.3 @PropertySource 사용
        • 1.13.4 Placeholder Resolution in Statements
      • 1.14 LoadTimeWeaver 등록 by ks
      • 1.15 ApplicationContext의 부가 수용가능성들 by ks, sh
        • 1.15.1 MesageSource를 사용한 국제화 by ks
        • 1.15.2 표준과 커스텀 이벤트 by ks
        • 1.15.3 로우 레벨 리소스에 대한 편리한 접근 by sh
        • 1.15.4 웹 어플리케이션에 대한 간편한 Application 인스턴스화 by sh
        • 1.15.5 스프링 ApplicationContext를 Java EE RAR 파일로 배포하가ㅣ by sh
        • 1.15.3 Low-level 리소스로 편리한 접근
        • 1.15.4 웹 어플리케이션을 위한 편리한 ApplicationContext 인스턴스화
      • 1.16 BeanFactory by sh
    • 2. Resource by ks
      • 2.1 소개
      • 2.2 Resource interface
      • 2.3 내장 리소스 확장
      • 2.4 ResourceReader
      • 2.5 ResourceLoaderAware 인터페이스
      • 2.6 Resources 의존성
      • 2.7 어플리케이션 컨텍스트와 리소스 경로
    • 3. 유효성 검사, 데이터 바인딩 및 유형 변환 by ys, sh
      • 3.1. Spring의 Validator 인터페이스를 사용하여 유효성 검사 by ys
      • 3.2. 오류 메시지로 코드 해결 by ys
      • 3.3. bean 조작과 BeanWrapper by ys
        • 3.3.1. 기본 및 중첩 된 프로퍼티를 설정 및 가져 오기
        • 3.3.2. 내장 된 PropertyEditor구현
      • 3.4 스프링 타입 변환 by sh
        • 3.4.1 Converter SPI
        • 3.4.2 ConverterFactory 사용하기
        • 3.4.3 GenericConverter 사용하기
        • 3.4.4 ConversionService API
        • 3.4.5 ConversionService 구성
        • 3.4.6 프로그래밍 방식으로 ConversionService 사용하기
      • 3.5 스프링 필드 포맷팅 by sh
        • 3.5.1 Formatter SPI
        • 3.5.2 Annotation 기반의 포맷팅
        • 3.5.3 FormatterRegistry SPI
        • 3.5.4 FormatterRegistrar SPI
        • 3.5.5 스프링 MVC에서 포맷팅 구성하기
      • 3.6 전역 Date and Time 포맷 구성 by sh
      • 3.7 스프링 유효성 검사 by sh
        • 3.7.1 by sh
        • 3.7.2 by sh
        • 3.7.3 by sh
    • 4 스프링 표현식 언어 (SpEL)
      • 4.1 평가 by sh
      • 4.2 빈 정의에 있는 표현식 by sh
      • 4.3 Language Reference
        • 4.3.1 리터럴 표현식 by ys
        • 4.3.2 프로퍼티,배열,목록,지도 및 인덱서 by ys
        • 4.3.3 인라인 목록 by ys
        • 4.3.4 인라인 Maps by ys
        • 4.3.5 배열 구성 by ys
        • 4.3.6 행동 양식 by ys
        • 4.3.7 연산자 by ys
        • 4.3.8 유형 by ys
        • 4.3.9 생성자 by ys
        • 4.3.10 변수 by ks
        • 4.3.11 함수 by ks
        • 4.3.12 빈 참조 by ks
        • 4.3.13 삼항 연산자 (If-Then-Else) by ks
        • 4.3.14 엘비스 연산자 by ks
        • 4.3.15 안전한 네비게이션 연산자 by ks
        • 4.3.16 컬렉션 셀렉션 by ks
        • 4.3.17 컬렉션 프로젝션 by ks
        • 4.3.18 표현 템플릿 by ks
    • 5 spring을 이용한 aspect 지향 프로그래밍
      • 5.1 AOP 개념 by ys
      • 5.2 Spring AOP 기능 및 목표 by ys
      • 5.3 AOP 프록시 by ys
      • 5.4 @AspectJ 지원 by ys,ks
        • 5.4.1 @AspectJ 지원 활성화 by ys
        • 5.4.2 Aspect 선언하기 by ys
        • 5.4.3 Pointcut 선언하기 by ys
        • 5.4.4 Advice 선언 by ks
        • 5.4.5 소개 by ks
        • 5.4.6 Aspect 초기화 모델 by ks
        • 5.4.7 AOP 예제 by ks
      • 5.5 스키마 기반 AOP 지원 by sh
        • 5.5.1 Aspect 선언 by sh
        • 5.5.2 Pointcut 선언 by sh
        • 5.5.3 Advice 선언 by sh
        • 5.5.4 인트로덕션 by sh
        • 5.5.5 Aspect 인스턴스화 모델 by sh
        • 5.5.6 Advisors by sh
        • 5.5.7 AOP 스키마 예제 by sh
    • 6 Spring AOP API
      • 6.1 Spring의 Pointcut API
        • 6.1.1 개념들 by ys
        • 6.1.2 Pointcuts에 대한 작업 by ys
        • 6.1.3 AspectJ Expression Pointcuts by ys
        • 6.1.4 편리한 Pointcut 구현 by ys
        • 6.1.5 포인트 컷 수퍼 클래스 by ys
        • 6.1.6. 사용자 정의 Pointcut by ys
      • 6.2 Spring의 Advice API
        • 6.2.1. 조언 라이프 사이클 by ys
        • 6.2.2 Spring의 advice 유형 by ys
      • 6.3 Spring의 Advisor API by ks
      • 6.4 ProxyFactoryBean을 사용해서 AOP 프록시 생성 by ks
        • 6.4.1 기본
        • 6.4.2 자바빈 프로퍼티
        • 6.4.3 JDK 및 CGLIB 기반 프록시
        • 6.4.4 프록시 인터페이스
        • 6.4 5 프록시 클래스
        • 6.4.6 "Global" advisor 사용
      • 6.5 간결한 프록시 정의 by sh
      • 6.6 ProxyFactory를 사용하여 프로그래밍 방식으로 AOP 프록시 만들기 by sh
      • 6.7 Advised 객체들 조작하기 by sh
      • 6.8 "자동 프록시" 기능 사용 by sh
      • 6.9 TargetSource구현체 사용하기 by sh
      • 6.10 새로운 Advice 타입 정의하기 by sh
    • 7. 데이터 버퍼와 코덱 by ks
Powered by GitBook
On this page

Was this helpful?

  1. spring 5.0
  2. 5 spring을 이용한 aspect 지향 프로그래밍
  3. 5.4 @AspectJ 지원 by ys,ks

5.4.3 Pointcut 선언하기 by ys

Previous5.4.2 Aspect 선언하기 by ysNext5.4.4 Advice 선언 by ks

Last updated 6 years ago

Was this helpful?

Pointcuts는 관심있는 조인 포인트를 결정하므로 advice를 실행할시기를 제어 할 수 있습니다. Spring AOP는 Spring 빈에 대한 메소드 실행 조인 포인트 만 지원하므로 Spring bean에서 메소드 실행과 pointcut이 일치한다고 생각할 수있다. 포인트 컷 선언은 이름과 매개 변수로 구성된 서명과 관심있는 메소드 실행을 정확하게 결정하는 pointcut 표현식의 두 부분으로 구성됩니다.

AOP의 @AspectJ 주석 스타일에서 포인트컷 신호는 일반 메소드 정의에 의해 제공되고 pointcut 표현식은 @Pointcut annotation을 사용하여 표시됩니다 (pointcut 서명 으로 사용 되는 메소드는 void반환 유형을 가져야합니다 ).

예를 들어 포인트 컷 신호와 포인트 컷 표현식을 구분할 수 있습니다. 다음 예제는 transfer라는 메서드의 실행과 일치하는 anyOldTransfer 라는 pointcut을 정의합니다.

@Pointcut("execution(* transfer(..))")// the pointcut expression
private void anyOldTransfer() {}// the pointcut signature

@Pointcut annotation의 값을 형성하는 pointcut 표현식 은 일반적인 AspectJ 5 pointcut 표현식이다. AspectJ의 pointcut 언어에 대한 자세한 설명은 ( ) 또는 AspectJ에 관한 책 중 하나 (예 : Colyer et al.의 Eclipse AspectJ 또는 AspectJ in Action , Ramnivas Laddad에 의해).

지원되는 Pointcut 지정자

Spring AOP는 pointcut 표현식에서 사용하기 위해 다음과 같은 AspectJ pointcut designator (PCD)를 지원한다.

  • execution: 메소드 실행 조인 포인트 일치. 이것은 Spring AOP로 작업 할 때 사용할 기본 pointcut 지정자이다.

  • within: 특정 타입 내의 조인 포인트 (Spring AOP를 사용할 때 일치하는 타입 내에서 선언 된 메소드의 실행)와 일치하는 것을 제한합니다.

  • this: Bean 레퍼런스 (Spring AOP proxy)가 주어진 타입의 인스턴스 인 조인 포인트 (Spring AOP를 사용할 때 메소드의 실행)와의 매치 제한.

  • target: 대상 객체 (프록시 될 애플리케이션 객체)가 주어진 유형의 인스턴스 인 조인 포인트 (Spring AOP를 사용할 때 메소드 실행)와 일치하는 제한.

  • args: 인자가 주어진 타입의 인스턴스 인 조인 포인트 (Spring AOP를 사용할 때 메소드 실행)와 일치하는 제한.

  • @target: 실행 객체의 클래스가 주어진 타입의 annotation을 가지고있는 조인 포인트 (Spring AOP를 사용할 때 메소드의 실행)로 일치하는 것을 제한합니다.

  • @args: 전달 된 실제 인수의 런타임 유형에 주어진 유형의 annotation이있는 조인 포인트 (Spring AOP를 사용할 때 메소드 실행)와의 일치가 제한됩니다.

  • @within: 지정된 주석 (Spring AOP을 사용할 때 주어진 주석이있는 유형으로 선언 된 메소드의 실행) 내에서 조인 포인트와 일치하는 것을 제한합니다.

  • @annotation: 조인 포인트의 주제 (Spring AOP에서 실행되는 메소드)가 주어진 annotation을 갖는 조인 포인트로 일치하는 것을 제한합니다.

다른 pointcut 유형

: 전체의 AspectJ 포인트 컷 언어는 call, get, set, preinitialization,staticinitialization, initialization, handler, adviceexecution, withincode, cflow, cflowbelow, if, @this,와 @withincode와 같이 spring에서 지원되지 않는 추가 포인트 컷 지정자 지원합니다.

Spring AOP에 의해 해석 된 pointcut 표현식에서 이러한 pointcut 지정자를 사용하면 결과 IllegalArgumentException가 던져진다.

Spring AOP가 지원하는 pointcut 지정자 세트는 향후 릴리스에서 확장되어 더 많은 AspectJ pointcut 지정자를 지원할 수있다.

Spring AOP는 메소드 실행 join point에만 매칭을 제한하기 때문에, 앞의 pointcut 지정자에 대한 설명은 AspectJ 프로그래밍 가이드에서 찾을 수있는 것보다 더 좁은 정의를 제공한다. 또한, AspectJ 자체는 타입 기반의 의미론을 가지고 있으며, 실행 joinpoint에서 this과 target은 동일한 객체, 즉 메소드를 실행하는 객체를 참조한다. Spring AOP는 프록시 기반 시스템이며 프록시 객체 자체 (this에 바인드 됨 )와 프록시 ( target에 바인드 됨 ) 뒤의 대상 객체를 구분합니다.

Spring의 AOP 프레임 워크의 프록시 기반 특성으로 인해 대상 객체 내에서 호출은 정의 상 가로 챌 수 없습니다. JDK 프록시의 경우 프록시에서 공용 인터페이스 메소드 호출 만 가로 챌 수 있습니다. CGLIB를 사용하면 프록시에 대한 public 및 protected 메소드 호출이 차단됩니다 (필요한 경우 패키지로 표시되는 메소드까지도). 그러나 프락시를 통한 공통적 인 상호 작용은 항상 공개 서명을 통해 설계되어야합니다.

포인트 컷 정의는 일반적으로 가로 챌 메소드와 일치합니다. pointcut이 public-only 일 것을 엄격하게 의미하는 경우 프록시를 통한 잠재적 인 비공개 상호 작용이있는 CGLIB 프록시 시나리오에서도 적절히 정의해야합니다.

Spring AOP는 또한 추가로 bean으로 명명 된 PCD를 지원합니다. 이 PCD를 사용하면 특정 명명 된 Spring bean 또는 명명 된 Spring bean 집합 (와일드 카드 사용시)으로 조인 포인트 일치를 제한 할 수 있습니다. beanPCD의 형식은 다음과 같습니다

bean(idOrNameOfBean)

idOrNameOfBean토큰은 spring 빈의 이름이 될 수 있습니다. *문자 를 사용하는 제한된 와일드 카드 지원 이 제공되므로 Spring 빈에 대해 몇 가지 명명 규칙을 설정하면 bean PCD 표현식을 작성하여 선택할 수 있습니다. 다른 pointcut 지정자의 경우와 마찬가지로 beanPCD는 &&(및), ||(또는) 및 !(부정) 연산자 와 함께 사용할 수 있습니다 .

beanPCD는 spring AOP에서만 지원되며 네이티브 AspectJ 직조에서는 지원되지 않습니다. 이것은 AspectJ가 정의한 표준 PCD에 대한 Spring 고유의 확장이며 따라서 @Aspect모델 에서 선언 된 aspect에 대해서는 사용할 수 없다 .

beanPCD 오히려 (weaving-based의 AOP이 제한되는) 유형 만 수준에서보다 (Spring bean name concept) 인스턴스 레벨에서 작동합니다. 인스턴스 기반 pointcut 지정자는 Spring의 프록시 기반 AOP 프레임 워크의 특수 기능이며 특정 bean을 이름으로 식별하는 것이 자연스럽고 직접적 인 Spring bean factory와의 긴밀한 통합입니다.

Pointcut 표현식 결합

당신은을 사용하여 pointcut 표현이 결합 될 수있다 결합 할 수 있습니다 &&, ||와 !. 포인트 컷 식을 이름으로 참조 할 수도 있습니다. 다음 예제에서는 세 가지 pointcut 표현식을 보여줍니다.

@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {} 

@Pointcut("within(com.xyz.someapp.trading..*)")
private void inTrading() {} 

@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} 

anyPublicOperation 메소드 실행 join point가 public 메소드의 실행을 나타내는 경우 일치합니다.

inTrading 메소드 실행이 거래 모듈에 있으면 일치합니다.

tradingOperation 메소드 실행이 거래 모듈의 모든 공개 메소드를 나타내는 경우 일치합니다.

앞에서 설명한 것처럼 더 작은 명명 된 구성 요소에서보다 복잡한 pointcut 식을 만드는 것이 좋습니다. pointcuts를 이름으로 언급 할 때 일반적인 Java 가시성 규칙이 적용됩니다 (동일한 유형의 개인 pointcuts, 계층의 보호 된 pointcuts, 어디에서나 public pointcuts 등을 볼 수 있음). 가시성은 pointcut 매칭에 영향을 미치지 않습니다.

일반적인 Pointcut 정의 공유

개발자는 엔터프라이즈 응용 프로그램을 사용하여 작업 할 때 응용 프로그램의 모듈과 특정 작업 집합을 여러 측면에서 참조하기를 원할 때가 있습니다. 이 목적을 위해 일반적인 pointcut 표현식을 캡처하는 "SystemArchitecture"측면을 정의하는 것이 좋습니다. 이러한 측면은 일반적으로 다음 예제와 유사합니다.

package com.xyz.someapp;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class SystemArchitecture {

    /**
     * A join point is in the web layer if the method is defined
     * in a type in the com.xyz.someapp.web package or any sub-package
     * under that.     
     메서드가 com.xyz.someapp.web 패키지 또는 
     그 아래의 하위 패키지에있는 유형으로 정의 된 경우 조인 포인트가 웹 레이어에 있습니다.
     */
    @Pointcut("within(com.xyz.someapp.web..*)")
    public void inWebLayer() {}

    /**
     * A join point is in the service layer if the method is defined
     * in a type in the com.xyz.someapp.service package or any sub-package
     * under that.
메소드가 com.xyz.someapp.service 패키지 또는 그 아래의 하위 패키지에있는 유형으로 
정의 된 경우 조인 포인트가 서비스 계층에 있습니다.
     */
    @Pointcut("within(com.xyz.someapp.service..*)")
    public void inServiceLayer() {}

    /**
     * A join point is in the data access layer if the method is defined
     * in a type in the com.xyz.someapp.dao package or any sub-package
     * under that.
     
메서드가 com.xyz.someapp.dao 패키지 또는 그 아래의 하위 패키지에있는 유형으로 정의 된 경우 
조인 포인트가 데이터 액세스 레이어에 있습니다.
     */
    @Pointcut("within(com.xyz.someapp.dao..*)")
    public void inDataAccessLayer() {}

    /**
     * A business service is the execution of any method defined on a service
     * interface. This definition assumes that interfaces are placed in the
     * "service" package, and that implementation types are in sub-packages.
     *
     * If you group service interfaces by functional area (for example,
     * in packages com.xyz.someapp.abc.service and com.xyz.someapp.def.service) then
     * the pointcut expression "execution(* com.xyz.someapp..service.*.*(..))"
     * could be used instead.
     *
     * Alternatively, you can write the expression using the 'bean'
     * PCD, like so "bean(*Service)". (This assumes that you have
     * named your Spring service beans in a consistent fashion.)
비즈니스 서비스는 서비스 인터페이스에 정의 된 모든 메소드의 실행입니다.
이 정의는 인터페이스가 "service"패키지에 있고 구현 유형이 하위 패키지에 있다고 가정합니다. 
기능 영역별로 서비스 인터페이스를 그룹화하는 경우 
(예 : com.xyz.someapp.abc.service 및 com.xyz.someapp.def.service 패키지)
대신 pointcut 표현 "execution (* com.xyz.someapp..service. *. * (*))"를 
사용할 수 있습니다.
또는 "bean (* Service)"처럼 'bean'PCD를 사용하여 표현식을 작성할 수 있습니다. 
(이것은 당신이 일관된 방식으로 Spring 서비스 빈의 이름을 지정했다고 가정한다.)
     */
    @Pointcut("execution(* com.xyz.someapp..service.*.*(..))")
    public void businessService() {}

    /**
     * A data access operation is the execution of any method defined on a
     * dao interface. This definition assumes that interfaces are placed in the
     * "dao" package, and that implementation types are in sub-packages.
     
데이터 액세스 작업은 DA 인터페이스에서 정의 된 모든 메소드의 실행입니다. 
이 정의는 인터페이스가 "dao"패키지에 있고 구현 유형이 하위 패키지에 있다고 가정합니다.
     */
    @Pointcut("execution(* com.xyz.someapp.dao.*.*(..))")
    public void dataAccessOperation() {}

}

포인트 컷식이 필요한 곳이면 어디서나 정의 된 pointcut를 참조 할 수 있습니다. 예를 들어 서비스 계층을 트랜잭션 방식으로 만들려면 다음을 작성할 수 있습니다.

<aop:config>
    <aop:advisor
        pointcut="com.xyz.someapp.SystemArchitecture.businessService()"
        advice-ref="tx-advice"/>
</aop:config>

<tx:advice id="tx-advice">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

예제들

Spring AOP 사용자는 executionpointcut 지정자를 가장 자주 사용합니다. 실행 식의 형식은 다음과 같습니다.

execution(modifiers-pattern? 
          ret-type-pattern declaring-type-pattern?
          name-pattern(param-pattern) throws-pattern?)

반환되는 유형 패턴 ( 앞의 스 니펫에서ret-type-pattern), 이름 패턴 및 매개 변수 패턴을 제외한 모든 부분 은 선택 사항입니다. 반환 형식 패턴은 조인 지점을 일치시키기 위해 메서드의 반환 형식이 무엇인지 결정합니다. *가 반환 유형 패턴으로 가장 많이 사용됩니다. 모든 반환 유형과 일치합니다. 정규화 된 형식 이름은 메서드가 지정된 형식을 반환하는 경우에만 일치합니다. 이름 패턴은 메소드 이름과 일치합니다. *와 와일드 카드는 이름 패턴의 전체 또는 사용할 수 있습니다 . 선언 형 패턴을 지정하는 경우, 후행 .을 포함시켜 이를 이름 패턴 구성 요소에 결합하십시오.

매개 변수 패턴은 약간 더 복잡합니다. ()는 매개 변수를 사용하지 않는 메소드와 일치하는 반면,(..)모든 숫자 (0 또는 그 이상의) 매개 변수와 일치합니다.

(*)패턴은 임의의 타입의 하나 개의 매개 변수를 일치시키는 방법. (*,String)는 두 개의 매개 변수를 사용하는 메소드와 일치합니다

다음 예제는 일반적인 pointcut 표현식을 보여줍니다 :

  • 모든 public 메소드의 실행 :

    execution(public * *(..))
  • 다음으로 시작하는 이름을 가진 메소드 실행 set:

    execution(* set*(..))
  • AccountService인터페이스에 의해 정의 된 모든 메소드의 실행 :

    execution(* com.xyz.service.AccountService.*(..))
  • service패키지에 정의 된 모든 메소드 실행 :

    execution(* com.xyz.service.*.*(..))
  • 서비스 패키지 또는 하위 패키지 중 하나에 정의 된 메소드 실행 :

    execution(* com.xyz.service..*.*(..))
  • 서비스 패키지 내의 모든 조인 포인트 (Spring AOP에서만 메소드 실행) :

    within(com.xyz.service.*)
  • 서비스 패키지 또는 그 서브 패키지 중 하나의 조인 포인트 (Spring AOP에서만 메소드 실행) :

    within(com.xyz.service..*)
  • 프록시가 AccountService인터페이스를 구현하는 모든 조인 포인트 (Spring AOP에서만 메소드 실행) :

    this(com.xyz.service.AccountService)

  • 대상 객체가 AccountService인터페이스를 구현하는 모든 조인 포인트 (Spring AOP에서만 메서드 실행) :

    target(com.xyz.service.AccountService)

  • 단일 매개 변수를 취하는 인수와 런타임에 인수가 전달되는 인수가 Serializable 인 모든 조인 포인트 (Spring AOP에서만 메서드 실행):

    args(java.io.Serializable)

  • 이 예제에서 주어진 포인트 컷은 execution(* *(java.io.Serializable))와 다르다. args 버전은 런타임에 전달 된 인수가Serializable이고, 메소드 서명이 Serializable type의 단일 매개 변수를 선언하면 실행 버전이 일치하는 경우 일치합니다.

  • 대상 객체에 @Transactionalannotation 이있는 모든 조인 포인트 (Spring AOP에서만 메서드 실행) :

    @target(org.springframework.transaction.annotation.Transactional)

  • 선언 된 대상 객체의 유형에 @Transactional주석 이있는 모든 조인 포인트 (Spring AOP에서만 메서드 실행) :

    @within(org.springframework.transaction.annotation.Transactional)

  • 실행중인 메소드에 @Transactional주석 이있는 모든 조인 포인트 (Spring AOP에서만 메소드 실행) :

    @annotation(org.springframework.transaction.annotation.Transactional)

  • 단일 매개 변수를 취하고 전달 된 인수의 런타임 유형에 @Classified주석 이있는 모든 조인 포인트 (Spring AOP에서만 메서드 실행) :

    @args(com.xyz.security.Classified)

tradeService로 명명 된 Spring bean에서 join point (Spring AOP에서만 메소드 실행):

bean(tradeService)
  • 와일드 카드 표현식과 일치하는 이름을 가진 Spring 빈에 대한 모든 조인 포인트 (Spring AOP에서만 메소드 실행) *Service:

    bean(*Service)

좋은 Pointcuts 작성하기

컴파일하는 동안 AspectJ는 일치하는 성능을 최적화하기 위해 pointcut을 처리한다. 코드를 검사하고 각 조인 포인트가 주어진 pointcut과 일치하는지 (정적 또는 동적으로) 결정하는 것은 값 비싼 프로세스입니다. 동적 일치는 정적 분석에서 일치를 완전히 결정할 수 없으며 코드가 실행 중일 때 실제 일치가 있는지 확인하기 위해 코드에 테스트가 배치된다는 의미입니다. AspectJ는 먼저 pointcut 선언을 만나면 그것을 일치하는 프로세스를위한 최적의 형태로 다시 작성한다. 이것은 무엇을 의미 하는가? 기본적으로 pointcut는 DNF (Disjunctive Normal Form)로 다시 작성되며 pointcut의 구성 요소는 평가하기에 더 저렴한 구성 요소가 먼저 확인되도록 정렬됩니다.

그러나, AspectJ는 그것이 무엇을 말했는지에만 작용할 수있다. 최적의 일치 성능을 얻으려면 자신이 성취하려는 대상에 대해 생각하고 일치하는 검색 공간을 최대한 정의해야합니다. 현존하는 지정자는 자연히 kinded, scoping 및 contextual의 세 그룹 중 하나로 분류됩니다.

  • Kinded 지정자 포인트 조인의 특정 종류를 선택 : execution, get, set, call, 및handler .

  • Scoping 지정자는 관심있는 조인 포인트 그룹을 선택합니다 (아마도 여러 종류가 있습니다 : within 하고withincode

  • 상황에 따라 문맥 지정자 일치 (및 선택적으로 바인드) : this, target및@annotation

잘 쓰여진 pointcut은 적어도 처음 두가지 유형 (kinded와 scoping)을 포함해야한다. 컨텍스트 지정자를 포함하여 조인 포인트 컨텍스트를 기반으로 일치 시키거나 해당 컨텍스트를 바인딩하여 조언에 사용할 수 있습니다. kinded 지정 자나 컨텍스트 지정자 만 작동하지만 추가 처리 및 분석으로 인해 성능 (시간 및 메모리 사용)에 영향을 미칠 수 있습니다. 스코프 지정자는 매우 빠르게 매칭되며, 사용법을 사용하면 AspectJ는 더 이상 처리되지 않아야하는 조인 포인트 그룹을 매우 빠르게 해제 할 수 있습니다. 가능한 한 좋은 pointcut은 항상 하나를 포함해야합니다.

인터셉터에 메소드 호출이나 대상 클래스 내의 생성자를 포함해야하는 경우 Spring의 프록시 기반 AOP 프레임 워크 대신 Spring 중심 를 사용하는 것을 고려하십시오 . 이것은 다른 특성을 가진 AOP 사용의 다른 모드를 구성하므로 결정을 내리기 전에 직조에 익숙해 져야합니다.

<aop:config>및 <aop:advisor>요소에서 설명 . 트랜잭션 요소는 에서 설명 합니다.

. 첫 번째 유형은 모든 유형이 될 수 있지만 두 번째 유형은 String 유형이어야합니다. 더 자세한 정보는 AspectJ Programming Guide 의 섹션을 참고하십시오.

'this'는 바인딩 양식에서보다 일반적으로 사용됩니다. advice 본문에서 프록시 객체를 사용할 수있게 만드는 방법에 대한 섹션을 참조하십시오 .

'대상'은 바인딩 양식에서보다 일반적으로 사용됩니다. advice 본문에서 대상 개체를 사용할 수있게 만드는 방법 은 참조하십시오 .

'args'는 바인딩 양식에서보다 일반적으로 사용됩니다. advice 본문에서 메소드 인수를 사용 가능하게 만드는 방법 은 섹션을 참조하십시오 .

바인딩 양식에서 '@target'을 사용할 수도 있습니다. 자세한 내용은 advice 본문에서 주석 객체를 사용 가능하게 만드는 방법 .

바인딩 양식에서 '@within'을 사용할 수도 있습니다. 참조조언 본문에서 주석 객체를 사용 가능하게 만드는 방법 .

바인딩 양식에서 '@ 주석'을 사용할 수도 있습니다. advice 본문에서 주석 객체를 사용 가능하게 만드는 방법 은 참조하십시오 .

바인딩 양식에서 '@args'를 사용할 수도 있습니다. 참조 섹션에서 조언 본문에서 주석 객체를 사용할 수있게 만드는 방법을 .

AspectJ Programming Guide
AspectJ 5 Developer 's Notebook
스키마 기반의 AOP 지원
트랜잭션 관리
Language Semantics
의 AspectJ 직조
advice 선언
선언 도움말을
선언 선언
선언 도움말을
Declaring 조언
선언 도움말을
Declaring 조언