이 문서 참조 : 봄 학습
우선, 예를 들어
위의 예에서, 여주인의 핵심 사업이, 그것은 같은 중개인에 반복되는 회색 상자의 일부와 사물의 가장자리의, 계약, 임대를 수집,이 충분하다 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 : 설정 >
올바른 결과를 참조, 테스트 프로그램을 실행합니다 :