제 5 장 AOP 구성 노트
5.1 포인트 컷 표현
5.1.1 역할
표현의 방법으로 하나 개 이상의 특정 연결 지점을 찾기.
5.1.2 구문에 대한 자세한 내용
- 포인트 컷 표현식 구문
execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表]))
- 그림
- AspectJ를, "&&", "||"로 포인트 컷 표현, "!"등으로 연산자를 결합합니다.
실제 애스펙트 클래스 5.1.3 엔트리 포인트 표현식
5.2 현재 연결 포인트 내역
5.2.1 개요
포인트 컷 표현식은 일반적으로 매크로 그룹에서 메소드를 위치 및 통지 특정 주석은 대응하는 연결 지점을 결정하기 위해 결합 될 수있다. 그래서 특정 연결 지점의 측면에서, 우리는 예를 들어, 정보의 특정 연결 지점에 대해 신경 수 있습니다 연결 지점의 현재 방법을 메소드의 이름, 매개 변수의 현재 값이 전달 등등 곳. 이 정보는 개체 인스턴스 joinpoint를 인터페이스에 캡슐화된다.
5.2.2 joinpoint를
5.3 통지
5.3.1 개요
- 특정 연결 지점에 대한 작업을 수행 할 수 있습니다.
- 섹션은 하나 이상의 알림을 포함 할 수있다.
- 주석 표현을 알리는 데 사용 값은 종종 출발점입니다.
5.3.2 사전 통지
- 조언 실행 방법으로 실행될 : 조언하기 전에
- 사용 @Before를 주석을
5.3.3 후면 통지
- 포스트 알림 리어 통지 즉 복귀 부착 점, 접속점의 완료 후에 수행하거나 결과 예외를 발생한다
- 사용 @After를 주석을
5.3.4 반환 통지
- 뉴스 가기 여부는 연결 지점은 정상 반환 또는 조언이 실행됩니다 후 예외가 throw됩니다. 당신이 연결 지점이 반환 될 때 기록하려면, 반환 통지 대신에 사후 통지를 사용해야합니다.
- 사용 @AfterReturning 주석, 액세스 포인트 연결 알림 반환 반환 값
반환 통지 ①,만큼 추가 주석을 @AfterReturning로 돌아의 속성은 연결 지점의 반환 값에 액세스 할 수 있습니다. 이 속성의 값의 반환 값에 전달 된 매개 변수의 이름을
서명 통지 방법에 같은 이름의 매개 변수를 추가해야합니다 ②. 런타임 반환 값에 스프링 AOP가이 매개 변수를 통해 전달
③ 원래의 접선 포인트 필요는 표현 속성 포인트 컷에 표시
5.3.5 예외 통보
- 이상주의 사항 : 비정상적인 이상 알림은 연결 지점에서 발생하는 경우
- 将throwing属性添加到@AfterThrowing注解中,也可以访问连接点抛出的异常。Throwable是所有错误和异常类的顶级父类,所以在异常通知方法可以捕获到任何错误和异常。
- 如果只对某种特殊的异常类型感兴趣,可以将参数声明为其他异常的参数类型。然后通知就只在抛出这个类型及其子类的异常时才被执行
5.3.6环绕通知
- 环绕通知是所有通知类型中功能最为强大的,能够全面地控制连接点,甚至可以控制是否执行连接点。
- 对于环绕通知来说,连接点的参数类型必须是ProceedingJoinPoint。它是 JoinPoint的子接口,允许控制何时执行,是否执行连接点。
- 在环绕通知中需要明确调用ProceedingJoinPoint的proceed()方法来执行被代理的方法。如果忘记这样做就会导致通知被执行了,但目标方法没有被执行。
- 注意:环绕通知的方法需要返回目标方法执行之后的结果,即调用 joinPoint.proceed();的返回值,否则会出现空指针异常。
5.4 重用切入点定义
- 在编写AspectJ切面时,可以直接在通知注解中书写切入点表达式。但同一个切点表达式可能会在多个通知中重复出现。
- 在AspectJ切面中,可以通过@Pointcut注解将一个切入点声明成简单的方法。切入点的方法体通常是空的,因为将切入点定义与应用程序逻辑混在一起是不合理的。
- 切入点方法的访问控制符同时也控制着这个切入点的可见性。如果切入点要在多个切面中共用,最好将它们集中在一个公共的类中。在这种情况下,它们必须被声明为public。在引入这个切入点时,必须将类名也包括在内。如果类没有与这个切面放在同一个包中,还必须包含包名。
- 其他通知可以通过方法名称引入该切入点
5.4 指定切面的优先级
- 在同一个连接点上应用不止一个切面时,除非明确指定,否则它们的优先级是不确定的。
- 切面的优先级可以通过实现Ordered接口或利用@Order注解指定。
- 实现Ordered接口,getOrder()方法的返回值越小,优先级越高。
- 당신이 @Order 노트를 사용하는 경우, 숫자는 주석에 표시