[제6 장]AOP 의 6.4 는@AspectJ 의 AOP 를 바탕 으로 나 에 게 spring 3 를 배 워 라.

10604 단어 spring
더 읽 기
       Spring 은 Schema 방식 으로 AOP 를 설정 하 는 것 외 에 주석 방식 도 지원 합 니 다.@AspectJ 스타일 의 절단면 성명 을 사용 합 니 다.
6.4.1  @AspectJ 지원 사용 하기
       Spring 은 기본적으로@AspectJ 스타일 의 절단면 설명 을 지원 하지 않 습 니 다.지원 하기 위해 서 는 다음 설정 을 사용 해 야 합 니 다.
 
자바 코드:

 
이렇게 하면 Spring 은@AspectJ 스타일 의 절단면 을 발견 하고 절단면 을 대상 에 적용 할 수 있 습 니 다.
6.4.2  성명 절단면
       @AspectJ 스타일 의 성명 절단면 은 매우 간단 합 니 다.@Aspect 주 해 를 사용 하여 성명 합 니 다.
 
자바 코드:
@Aspect()
Public class Aspect{
……
}

 
       그리고 이 절단면 을 설정 파일 에 Bean 이 라 고 표시 하면 Spring 은 자동 으로 AOP 설정 을 식별 하고 진행 할 수 있 습 니 다.
 
자바 코드:

 
       이 절단면 은 POJO 로 이 절단면 에서 삽입점 및 알림 정 의 를 내 릴 수 있 으 니 아래 를 내 려 다 보 세 요.
 
6.4.3  성명 접근 점
       @AspectJ 스타일 의 이름 입력 점 은 org.aspectj.lang.annotation 패키지 의@Pointcut+방법(방법 은 void 형식 으로 되 돌아 가 야 합 니 다)을 사용 합 니 다.
 
자바 코드:
@Pointcut(value="      ", argNames = "     ")
public void pointcutName(……) {}
 

       value:절 입 점 표현 식 을 지정 합 니 다.
       argNames:절 입 점 방법 매개 변수 목록 매개 변수 이름 을 지정 합 니 다.","구분 할 수 있 습 니 다.이 매개 변 수 는 알림 방법 과 같은 이름 의 매개 변수 에 전 달 됩 니 다.또한 절 입 점 표현 식"args(param)"와 일치 하 는 매개 변수 유형 을 절 입 점 방법 과 같은 이름 의 매개 변수 형식 으로 지정 합 니 다.
       pointcutName:점 이름 을 자 르 면 이 이름 으로 점 표현 식 을 참조 할 수 있 습 니 다.
 
자바 코드:
@Pointcut(value="execution(* cn.javass..*.sayAdvisorBefore(..)) && args(param)", argNames = "param")
public void beforePointcut(String param) {}

 
절 입 점 을 정의 합 니 다.이름 은"beforePointcut"입 니 다.이 절 입 점 은 목표 방법 과 일치 하 는 첫 번 째 매개 변수 유형 을 알림 방법 실현 중 매개 변수 이름 이"param"인 매개 변수 형식 으로 합 니 다.
 
6.4.4  성명 통지
       @AspectJ 스타일 의 성명 알림 도 5 가지 알림 형식 을 지원 합 니 다.
 
1.사전 알림:org.aspectj.lang.annotation 패키지 의@Before 설명 을 사용 합 니 다.
 
자바 코드:
@Before(value = "            ", argNames = "       ")

 
       value:절 입 점 표현 식 이나 이름 절 입 점 을 지정 합 니 다.
       argNames:Schema 방식 설정 과 같은 의미 입 니 다.
 
다음은 예 를 들 어 보 자.
1.인터페이스 와 실현 을 정의 합 니 다.여기 서 저 희 는 Schema 스타일 의 정 의 를 사용 합 니 다.
2.절단면 정의:
 
자바 코드:
package cn.javass.spring.chapter6.aop;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class HelloWorldAspect2 {
 
}

 
3.접점 정의:
 
자바 코드:
@Pointcut(value="execution(* cn.javass..*.sayAdvisorBefore(..)) && args(param)", argNames = "param")
public void beforePointcut(String param) {}

 
4.정의 알림:
 
자바 코드:
@Before(value = "beforePointcut(param)", argNames = "param")
public void beforeAdvice(String param) {
    System.out.println("===========before advice param:" + param);
}

 
5.chapter 6/advice 2.xml 설정 파일 에서 다음 과 같이 설정 합 니 다.
 
자바 코드:


          
  
  
 
  
 

 

 
6,테스트 코드 cn.javass.spring.chapter 6.AopTest:
 
자바 코드:
@Test
public void testAnnotationBeforeAdvice() {
    System.out.println("======================================");
    ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter6/advice2.xml");
    IHelloWorldService helloworldService = ctx.getBean("helloWorldService", IHelloWorldService.class);
    helloworldService.sayBefore("before");
    System.out.println("======================================");
}

 
 
출력:
 
 
 
==========================================
===========before advice param:before
============say before
==========================================
 
 
 
 
 
 
 
 
 
 
절단면,삽입점,알림 모두 주석 사용 완료:
       1)@Aspect 를 사용 하여 POJO 를 절단면 으로 선언 합 니 다.
       2)@Pointcut 을 사용 하여 명명 절 입 점 성명 을 하고 목표 방법의 첫 번 째 매개 변수 유형 은 java.lang.String 이 어야 합 니 다.다른 일치 하 는 방법 에 대해 서도 매개 변수 유형 이 일치 하지 않 는 것 은 일치 하지 않 습 니 다.argNames="param"을 통 해 일치 하 는 목표 방법의 매개 변 수 를 같은 이름 의 매개 변수 에 전달 할 것 을 지정 하 였 습 니 다.
       3)@Before 를 사용 하여 사전 알림 성명 을 진행 합 니 다.그 중에서 value 는 절 입 점 표현 식 을 정의 하거나 이름 절 입 점 을 참조 하 는 데 사 용 됩 니 다.
       4)설정 파일 은 주석 스타일 의@AspectJ 지원 을 열기 위해 사용 해 야 합 니 다.
       5)"aspect"Bean 과 같은 절단면 을 Bean 으로 등록 해 야 합 니 다.
       6)테스트 코드 는 완전히 같다.
 
 
2.리 턴 알림:org.aspectj.lang.annotation 패키지 의@AfterReturning 설명 을 사용 합 니 다.
 
자바 코드:
@AfterReturning(
value="            ",
pointcut="            ",
argNames="       ",
returning="        ")

       value:절 입 점 표현 식 이나 이름 절 입 점 을 지정 합 니 다.
       pointcut:같은 절 입 점 표현 식 이나 이름 절 입 점 을 지정 합 니 다.value 속성 을 덮어 쓰 는 것 을 지정 하면 pointcut 는 높 은 우선 순 위 를 가지 고 있 습 니 다.
       argNames:Schema 방식 설정 과 같은 의미 입 니 다.
       returning:Schema 방식 설정 과 같은 의미 입 니 다.
 
 
자바 코드:
@AfterReturning(
    value="execution(* cn.javass..*.sayBefore(..))",
    pointcut="execution(* cn.javass..*.sayAfterReturning(..))",
    argNames="retVal", returning="retVal")
public void afterReturningAdvice(Object retVal) {
    System.out.println("===========after returning advice retVal:" + retVal);
}

 
그 중에서 테스트 코드 는 Schema 방식 과 거의 같 습 니 다.여기 서 보 여 주지 않 습 니 다.필요 하 다 면 AopTest.java 의 testAnnotation After Returning Advice 테스트 방법 을 참고 하 십시오.
 
3.후 이상 알림:org.aspectj.lang.annotation 패키지 에 있 는@AfterThrowing 설명 을 사용 합 니 다.
 
자바 코드:
@AfterThrowing (
value="            ",
pointcut="            ",
argNames="       ",
throwing="       ")
 

 
       value:절 입 점 표현 식 이나 이름 절 입 점 을 지정 합 니 다.
       pointcut:같은 절 입 점 표현 식 이나 이름 절 입 점 을 지정 합 니 다.value 속성 을 덮어 쓰 는 것 을 지정 하면 pointcut 는 높 은 우선 순 위 를 가지 고 있 습 니 다.
       argNames:Schema 방식 설정 과 같은 의미 입 니 다.
       throwing:Schema 방식 설정 과 같은 의미 입 니 다.
 
 
자바 코드:
@AfterThrowing(
    value="execution(* cn.javass..*.sayAfterThrowing(..))",
    argNames="exception", throwing="exception")
public void afterThrowingAdvice(Exception exception) {
    System.out.println("===========after throwing advice exception:" + exception);
}

 
그 중에서 테스트 코드 는 Schema 방식 과 거의 같 습 니 다.여기 서 보 여주 지 않 습 니 다.필요 하 다 면 AopTest.java 의 testAnnotation After Throwing Advice 테스트 방법 을 참고 하 십시오.
 
4.최종 알림:org.aspectj.lang.annotation 패키지 의@After 설명 을 사용 합 니 다.
 
자바 코드:
@After (
value="            ",
argNames="       ")

       value:절 입 점 표현 식 이나 이름 절 입 점 을 지정 합 니 다.
       argNames:Schema 방식 설정 과 같은 의미 입 니 다.
 
 
자바 코드:
@After(value="execution(* cn.javass..*.sayAfterFinally(..))")
public void afterFinallyAdvice() {
    System.out.println("===========after finally advice");
}

 
그 중에서 테스트 코드 는 Schema 방식 과 거의 같 습 니 다.여기 서 보 여주 지 않 습 니 다.필요 하 다 면 AopTest.java 의 testAnnotation After Finally Advice 테스트 방법 을 참고 하 십시오.
 
 
5.서 라운드 알림:org.aspectj.lang.annotation 패키지 의@Around 설명 을 사용 합 니 다.
 
자바 코드:
@Around (
value="            ",
argNames="       ")

 
       value:절 입 점 표현 식 이나 이름 절 입 점 을 지정 합 니 다.
       argNames:Schema 방식 설정 과 같은 의미 입 니 다.
 
 
자바 코드:
@Around(value="execution(* cn.javass..*.sayAround(..))")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
    System.out.println("===========around before advice");
    Object retVal = pjp.proceed(new Object[] {"replace"});
    System.out.println("===========around after advice");
    return retVal;
}

 
 
그 중에서 테스트 코드 는 Schema 방식 과 거의 같 습 니 다.여기 서 보 여 주지 않 습 니 다.필요 하 다 면 AopTest.java 의 annotation Around AdviceTest 테스트 방법 을 참고 하 십시오.
6.4.5  끌어들이다
       @AspectJ 스타일 의 도입 성명 은 절단면 에서 org.aspectj.lang.annotation 패키지 의@Declare Parents 성명 을 사용 합 니 다.
 
자바 코드:
@DeclareParents(
value=" AspectJ       ",
defaultImpl=          )
private Interface interface;

 
       value:인 터 페 이 스 를 도입 해 야 할 대상 과 일치 하 는 AspectJ 문법 형식 표현 식;Schema 방식 의 types-matching 속성 과 같은 의미;
       private Interface interface:도입 할 인 터 페 이 스 를 지정 합 니 다.
       defaultImpl:인 터 페 이 스 를 도입 하 는 기본 구현 클래스 를 지정 합 니 다.Schema 방식 의 delegate-ref 속성 과 같은 의미 의 정의 방식 이 없습니다.
 
자바 코드:
@DeclareParents(
    value="cn.javass..*.IHelloWorldService+", defaultImpl=cn.javass.spring.chapter6.service.impl.IntroductiondService.class)
private IIntroductionService introductionService;
 

 
       그 중에서 테스트 코드 는 Schema 방식 과 거의 같 습 니 다.여기 서 보 여주 지 않 습 니 다.필요 하 다 면 AopTest.java 의 testAnnotationIntroduction 테스트 방법 을 참고 하 십시오.
 
오리지널 내용,전재 출처 를 밝 혀 주세요[http://sishuok.com/forum/blogPost/list/0/2471.html】

좋은 웹페이지 즐겨찾기