봄 학습 (팔) AOP 상세

이 문서 참조 : 봄 학습

우선, 예를 들어

 

  위의 예에서, 여주인의 핵심 사업이, 그것은 같은 중개인에 반복되는 회색 상자의 일부와 사물의 가장자리의, 계약, 임대를 수집,이 충분하다 AOP 중 하나 아이디어 : 비즈니스 코드에서 별도의 코드의 우려를하자!

분석의 예

1. LandlordService [서비스 클래스에서 [패키지] 만들기 (핵심 사업)

/ ** 
 * 사업의 여주인 관리 ~ (아날로그의 핵심 사업) 
 * / 
@Component ( "집주인" )
 공개  수업 LandlordService {
     공공  무효 서비스 () {
         // 단지 실현의 핵심 비즈니스 기능 
        에서 System.out.println ( "계약" ); 
        에서 System.out.println ( "임대 소득" ); 
    } 
}

2. 신규의 패키지 [양태 다음에 중개 [ BrokerAspect ] 클래스 (주변 기능)

/ ** 
 * 여주인 상관하지 ~ 
 * ~ 중개 서비스 관련 (아날로그 주변 장치 기능) 
 * / 
@Component 
@Aspect 
클래스 BrokerAspect { 

    @Before ( "실행 (service.LandlordService.service의 * ())" )
     공공  무효 전 ( ) { 
        에서 System.out.println ( "세입자 상영 대역" ) 
        에서 System.out.println ( "가격" ) 
    } 

    @After ( "실행 (* service.LandlordService.service ())" )
     공중  공극 후 () { 
        에서 System.out.println ( "턴키" ); 
    } 
}

3. 구성은 자동으로 applicationContext.xml에 주입하고, Spring IoC 컨테이너 검사 모두 콩을 어디로 말했다

<? XML 버젼 = "1.0"인코딩 = "UTF-8" ?> 
< 의 xmlns = "http://www.springframework.org/schema/beans" 
       의 xmlns :이 xsi = "http://www.w3.org/2001 / 된 XMLSchema 인스턴스 " 
       XMLNS : 문맥 ="http://www.springframework.org/schema/context " 
       XMLNS : AOP ="http://www.springframework.org/schema/aop " 
       XSI :의 schemaLocation ="HTTP : //www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context HTTP : //www.springframework .ORG / 스키마 / 환경 / 스프링 context.xsd http://www.springframework.org/schema/aop HTTP : //www.springframework.

    < 컨텍스트 : 구성 요소 - 스캔 자료-패키지 페널티에 대한 = "화면" /> 
    < 컨텍스트 : 구성 요소 - 스캔 에 대한 자료-패키지 페널티 = "서비스" /> 

    <! - 문이 자동으로 빈의 그 측면 @Aspect 스프링 컨테이너 구성에 대한 프록시를 만들려면 섹션을 직조. -> 
    < AOP : AspectJ를 - 더 자동 프록시 /> 
    
</ >

4. 쓰기 테스트 클래스

공용  클래스 TestSpring { 
    @Test 
    공개  공극 시험 () { 
        ApplicationContext의 컨텍스트 = 새로운 ClassPathXmlApplicationContext ( "applicationContext.xml" ); 
        LandlordService 집주인 = (LandlordService) context.getBean ( "지주"LandlordService. 클래스 ); 
        landlord.service (); 
    } 
}

5. 결과를 확인

둘째, 사용 주석은 스프링 AOP를 개발

한 단계 : 연결 지점을 선택

  봄은 우리가 연결 지점으로 클래스 메소드의 주요 양 또한, 메소드 레벨 AOP 프레임 워크입니다, 그 말의 또 다른 방법은 다음과 같습니다 개선의 유형을 선택해야할지 방법.

    ...
     공공  무효 - 서비스는 () {
         // 단지 핵심 비즈니스 기능 구현 
        에서 System.out.println ( "계약" ) 
        에서 System.out.println ( "임대 소득을" ) 
    } 
    ....

  여기 LandlordService 클래스는 접속 포인트로서 서비스 ()을 선택하는 방법.

2 단계 : 섹션 만들기

  섹션을 만들 수있는 좋은 연결 지점을 선택, 우리는 프로그램이 연결 지점에 실행될 때의 말에, 초기화하는 방법을 추가하는 시작 부분에 막았다 인터셉터로 이해 줄일 수는 파괴의 방법에 합류 단지, 봄 그냥 사용에 @Aspect 클래스에 주석을, 다음 Spring IoC 컨테이너는이 조각이라고 생각합니다 :

/ ** 
 * 여주인 상관하지 ~ 
 * ~ 중개 서비스 관련 (아날로그 주변 장치 기능) 
 * / 
@Component 
@Aspect 
클래스 BrokerAspect { 

    @Before ( "실행 (service.LandlordService.service의 * ())" )
     공공  무효 전 ( ) { 
        에서 System.out.println ( "세입자 상영 대역" ) 
        에서 System.out.println ( "가격" ) 
    } 

    @After ( "실행 (* service.LandlordService.service ())" )
     공중  공극 후 () { 
        에서 System.out.println ( "턴키" ); 
    } 
}

PS : 클래스의 부분으로 정의된다 여전히 빈입니다, 필요 @Component 코멘트를 표시

세 번째 단계 : 접선 지점의 정의

  일반 식 상기 코멘트의 실행을 정의 스프링 정규 표현하는 방법의 클래스를 차단하는 콘크리트 결정 :

실행 (* service.LandlordService.service ())

  이 식의 분석 다음 :

  • 실행 : 대표자 실행 방법을 트리거합니다
  • * : 복귀 방법의 모든 유형을 나타냅니다
  • service.LandlordService 클래스 대표의 완전한 이름을 :
  • 서비스 () : 방법 차단 이름

4 단계 : 테스트 AOP

  이 사전 통지 및 사후 통지, 그것은 연결 지점의 방법의 원래 기능을 유지 통합 때문에 이제,이 봄 AOP 통지의 가장 강력한 조언을 중심으로 알아 보자, 그래서 그것은 있도록 강력하고 유연한 이제 살펴 보자 :

/ ** 
 * 집주인이 상관 ~ 
 * ~ 중개 서비스 관련 (아날로그 주변 기능) 
 * / 
@Component 
@Aspect 
클래스 BrokerAspect { 

//   전과는 @Before @After 주석 및 대응 방법 주석
 //   (@Before을 "실행 (* service.LandlordService.service ())")
 //   {공공 무효 전과 ()
 //       에서 System.out.println (이하 "세입자 상영과 함께");
 //       에서 System.out.println (이하 "가격에 대해 이야기 ");
 //   }
 // 
//   @After ("실행 (* service.LandlordService.service ()) ")
 //   (후 공개 무효) {
 //       에서 System.out.println ("턴키 ");
 / /   } 

    //   사전 및 사후 알림을 완료하면서 @Around 주석을 사용
    @Around ( "실행 (* service.LandlordService.service ())" )
     공중  공극 주위 (joinpoint를 ProceedingJoinPoint) { 
        에서 System.out.println ( "带租客看房" ); 
        에서 System.out.println ( "谈价格" ); 

        시도 { 
            joinPoint.proceed를 (); 
        } 캐치 (throw 가능 객체의 Throwable) { 
            throwable.printStackTrace (); 
        } 

        에서 System.out.println ( "交钥匙" ); 
    } 
}

  결과는 여전히 올바른 테스트 코드를 실행합니다 :

셋째, 개발하여 XML 구성 봄 AOP

  주석 우리는 여전히 우리가 처음 AOP를 구성 할 수있는 요소를보고, 이해하는 데 필요한 매우 강력한 것, 그러나 XML 개발자를 기반으로 :

  경험에 의한 사전 서면 주석, 그리고 위의 표에, 우리는 (모든 메모를 제거하기 위해) 위의 예제 XML 구성은 매우 간단 다시 작성합니다 :

<! - 조립 콩 -> 
< 이름 = "집주인" 클래스 = "pojo.Landlord" /> 
< ID = "브로커" 클래스 = "aspect.Broker" /> 

<! - AOP의 구성 -> 
< AOP는 : 설정 > 
    <! - 를 Where는 : 어떤 영역 (.. 가방 방법) 증가 않습니다 -> 
    < AOP : 포인트 컷 위에서 언급 한 id = "landlordPoint" 
                  표현식 = "실행 (* pojo.Landlord.service ())" /> 
    <! - 뭐라고 : 강화하는 일 -> 
    < AOP :화면 ID = "logAspect" REF= "브로커" > 
        <! - 때 (/ 후 / 이전과 이후 이전 방법) 어떤 계기에서 -> 
        < AOP : 주위 포인트 컷-REF = "landlordPoint" 방법, = "주위에" /> 
    </ AOP : 화면 > 
< / AOP : 설정 >

올바른 결과를 참조, 테스트 프로그램을 실행합니다 :

 

추천

출처www.cnblogs.com/riches/p/11558164.html