AOP는 - 가로 만들기
이제 측면을 만드는 방법을 보도록하자.
먼저 우리는 우리가 우리 pointcuts를 작성합니다하는 인터페이스 예제를 만들려면 :
MyInterface {공용 인터페이스
공공 공극 F1 ();
공공 int는 F2 ();
공공 int는 F3 ()는 예외를 throw;
공공 공극 F4 ()는 예외를 throw;
공공 INT F5 ();
}
pointcut을 작성하려면 알고 있어야 AspectJ pointcut의 designators을 , 우리의 예제에서 우리는 실행 메소드의 실행 일치하는 지점을 조인을 사용합니다.
실행 유형의 표현의 형식은 다음과 같습니다 :
실행 (수정자 - 패턴? RET 형 패턴 선언 형 패턴? 이름 패턴 (패턴 PARAM) 던졌습 패턴?)위치 :
- 수정자 - 패턴 : paremetro 선택적 수정자은 그 방법의 유형을 나타냅니다. 값 *은 수정자의 모든 유형과 일치합니다.
- RET 형 패턴 : 메서드의 반환 형식을 나타냅니다. 값 * 보답 모든 유형과 일치합니다.
- 선언 형 패턴 : 옵션 매개 변수는 메서드를 선언 클래스를 나타냅니다. * 값이 완전히 클래스 이름 또는 그것의 일부를 대체하기 위해 와일드 카드로 사용됩니다.
- 이름 - 패턴 : 메서드의 이름입니다. * 값이 완전히 메서드 또는 일부의 이름을 대체하기 위해 와일드 카드로 사용됩니다.
- PARAM - 패턴 : 메소드 매개 변수를 나타냅니다. 값이 (...) 0 개 이상의 매개 변수를 허용하는 방법을 나타내는 반면 값이 (), 아무 매개 변수도지지 않습니다 메서드를 나타냅니다. * 값이 같은 메서드의 매개 변수 (*, java.lang.String)의 형식을 대체하기 위해 와일드 카드로 사용됩니다 입력으로 두 개의 매개 변수 걸립 방법과 일치하는 모든 유형의 첫 번째, 두 번째 유형의 문자열.
- 드로우 - 패턴 : 선택적 매개 변수가 메서드에서 발생한 예외의 유형을 나타냅니다 예를 들어, java.lang.Exception을 던지세요
무엇보다도 우리는 우리의 관점을 만들어야합니다 :
@ 가로
공용 클래스 {MyAspect
.............
}
우리가 보는 바와 같이 클래스는 @ 가로와 주석입니다.
. 당신은 AOP nell'applicationContext XML에 대한 지원을 활성화해야하기 때문에 충분하지 않다 :
<-! ENBLING AspectJ -> <aop:aspectj-autoproxy /> <-! MYASPECT -> <bean id="myAspect" class="it.mrwebmaster.aop.MyAspect" />
일단이 두 가지 조언을 만들 준비가 완료 예를 들어, 작업 메서드 F1의 실행 (상담 전) 전에 수행 :
@ 전에 ( "실행 (* it.mrwebmaster.aop.MyInterface.f1 (..))")
공공 공극 beforeF1 () {
System.out.println ( "F1 전에");
}
코드에서 볼 수 있듯이 우리는 pointcut 표현을 식별하는 이러한 가치를 수락하기 전에 주석 @를 사용했습니다.
우리의 예제에서 표현식은 F1 it.mrwebmaster.aop.MyInterface에게 수정자, 반환 유형 및 입력 매개 변수들의 상관없이 전화를하고있는 인터페이스 방식과 일치합니다.
마찬가지로 우리는 방법이 제대로 주석 @ AfterReturning을 사용하여 실행 (조언을 반환 이후) 완료될 때 실행 조언을 사용할 수 있습니다 :
@ AfterReturning (pointcut을 = "실행 (* it.mrwebmaster.aop.MyInterface.f2는 (..))"= "retVal"를 반환)
공공 무효 afterReturningF2 (객체 retVal) {
System.out.println ( "F2 리턴 '+ retVal);
}
이 기록이 매개 변수로 받아, pointcut 이외에, 이름은 입력 매개 변수 dell'advice로 주어진 수 있습니다 메소드에 의해 반환된 개체에 주어진.
이 경우 pointcut의 표현은이 경우에는 F2는 메서드의 이름을 제외하고 inviarata 남아있다.
매우 유사한는 방법은 주석 @ AfterThrowing를 사용하여 예외를 (조언을 던지는 이후) 던졌습 때 실행되는 조언입니다
@ AfterThrowing (pointcut = "실행 (* it.mrwebmaster.aop.MyInterface.f3 (..))"= "throwable"를 던지기)
공공 무효 afterThrowingF3 (Throwable throwable) {
System.out.println (+ throwable "를 F3은 던진다");
}
차이점은 메서드 개체에 있지만 예외를 반환한다는 것입니다.
조언의 또 다른 유형은 항상 메서드 후 실행은 정상적이나 용어 예외 (상담 후) 시작, 그 이유입니다. 이 조언은 후 @의 사용을 통해 구현됩니다 :
@ 후 ( "실행 (* it.mrwebmaster.aop.MyInterface.f4 (..))")
공공 공극 afterF4 () {
System.out.println ( "F4 이후 ');
}
마지막으로 우리는 조언 주변 '만드는 방법을 참조하십시오
@ 주변 ( "실행 (* it.mrwebmaster.aop.MyInterface.f5 (..))")
공공 무효 aroundF5 (ProceedingJoinPoint PJP) {
System.out.println ( "F5 전에");
시도 {
retVal =) (pjp.proceed 객체;
System.out.println ( "F5 리턴 '+ retVal);
} 캐치 (Throwable e)를 {
System.out.println ( "F5가 던진다"+ E);
}
}
우리는 pointcut 표현의 코드에서 볼 수 있듯이 다른 조언과 다릅니다 없습니다.
어떤 변화하는 것은 명시적으로 방법으로 메서드의 실행을 호출해야합니다 같은 조언 가진 인스턴스 입력으로 전달된다 ProceedingJoinPoint 수업 진행.
이 인터페이스는, 제공 방법 이외에 방법은, 반환 형식과 메서드가 실행되는 개체의 매개 변수에 대한 정보를 검색하기 위해 다른 방법을 진행.
그것은 독자에 깊이 남아있다.
우리의 조언을 테스트하려면 우리는 인터페이스 MyInterface의 사소한 구현을 쓰기, 주요 테스트를 만들어야합니다 :
MyInterfaceImpl {공용 클래스가 MyInterface를 구현
@ 무시
공공 공극 F1 () {
System.out.println ( "F1");
}
@ 무시
공공 int는 F2 () {
System.out.println ( "F2");
0을 반환;
}
@ 무시
공공 INT F3는 () {예외를 throw합니다
System.out.println ( "F3");
새 예외 ( "F3 예외")하다;
}
@ 무시
공공 공극 F4가 () {예외를 throw합니다
System.out.println ( "F4");
}
@ 무시
공공 INT F5 () {
System.out.println ( "F5");
0을 반환;
}
}
. nell'applicationContext XML :
<-! 대상 개체 -> <bean id="myInterfaceImpl" class="it.mrwebmaster.aop.MyInterfaceImpl" />주요 시험 :
공용 클래스 메인 {
공공 정적 무효 메인 (문자열 [] 인수) {
/ **
* Instanzio IOC 컨테이너
* /
ApplicationContext ApplicationContext = 새로운 ClassPathXmlApplicationContext ( "applicationContext.xml");
MyInterface MyInterface = (MyInterface) applicationContext.getBean ( "myInterfaceImpl");
myInterface.f1 ();
System.out.println ( "# # # # # # # # # # \ N");
myInterface.f2 ();
System.out.println ( "# # # # # # # # # # \ N");
시도 {
myInterface.f3 ();
} 캐치 (예외 전자) {}
System.out.println ( "# # # # # # # # # # \ N");
시도 {
myInterface.f4 ();
} 캐치 (예외 전자) {}
System.out.println ( "# # # # # # # # # # \ N");
myInterface.f5 ();
System.out.println ( "# # # # # # # # # # \ N");
}
}






