소개
방향 지향적 프로그래밍 (AOP)은 객체 지향 프로그래밍 (OOP)의 단점을 보완하는 프로그램 구조에 대해 생각할 또 다른 관점을 제공합니다. AOP는 클래스 외에도 측면을 제공합니다. 여러 유형 및 객체의 교차 절단 트랜잭션 관리와 같은 초점을 모듈화하십시오. (이 문제 용어는 종종 크로스 커팅 문제라고합니다.)
Spring의 주요 구성 요소는 AOP 프레임 워크입니다. 그럼에도 불구하고 Spring IOC 컨테이너는 AOP에 의존하지 않으므로 AOP 사용 여부를 자유롭게 선택할 수 있습니다. AOP는 강력한 미들웨어 솔루션을 제공하여 Spring IOC 컨테이너를보다 완전하게 만듭니다.
Spring 2.0 AOP :
Spring 2.0은 섹션을 사용자 정의하는보다 간단하고 강력한 방법을 소개하며 사용자는 스키마 기반 메소드를 사용하거나 @aspectj 주석을 사용할 수 있습니다. 새로운 응용 프로그램의 경우 사용자가 Java 5에서 개발하는 경우 사용자가 @aspectj 스타일을 사용하는 것이 좋습니다. 그렇지 않으면 패턴 기반 스타일을 사용할 수 있습니다. 두 스타일 모두 Spring AOP를 사용하여 직조 중이지만 조언 유형과 SpectJ의 포인트 인 절단 언어를 완전히 지원합니다.
이 장에서는 주로 패턴 기반 및 @AspectJ 기반 AOP에 대한 Spring 2.0의 지원에 대해 설명합니다. Spring 2.0은 Spring 1.2의 후진 호환성을 완전히 유지합니다. 다음 장에서는 Spring 1.2 API가 제공하는 기본 AOP 지원에 대해 논의합니다.
봄에 사용 된 AOP :
신고 기업 서비스는 특히 EJB 선언 서비스 대신 제공됩니다. 가장 중요한 서비스는 Spring의 추상 거래 추상화를 기반으로 한 선언 거래 관리입니다.
사용자는 사용자 정의 섹션을 구현하고 AOP를 사용하여 OOP 사용을 개선 할 수 있습니다.
예
우리는 종종 다음 유형을 사용합니다
1. 에이전트를 기반으로 한 AOP
2. 순수하고 간단한 자바 객체 패싯
3. @aspect 주석 양식
4. 주입 형태의 ASPCET 섹션을 하나씩 적용 해 봅시다.
몇 가지 기본 수업을 먼저 봅시다.
인터페이스 클래스 :
/ *** 인터페이스 정의*/ public interface sleepable {/ *** 수면 방법*/ void sleep (); } 구현 클래스 :
/ *** 나는 수면 인터페이스를 구현*/ public class chenllina는 sleepable을 구현합니다 {@override public void sleep () {// todo 자동 생성 메소드 스터브 System.out.println ( "잘, 잠자리에들 시간입니다!"); }} 향상 클래스 :
/ *** 사전 설정 및 포스트 세트 및 포스트 세트*/ 공개 클래스 슬리트 펠퍼 구현 메소드 버전, 애프터 리턴 딩 버전 {@override public void after-returning (객체 returnValue, method method, args, objects, 객체 대상) 던지기 가능한 {system.out.println (침대에 가기 전 마스크 적용)을 달성하기위한 수면 향상을 정의합니다. } @override public void 이전 (메소드 메소드, 개체 [] args, 객체 대상) 던지기 가능 {system.out.println ( "잠자는 후 꿈"); }}1. 에이전트 기반 AOP
<!-강화 조언을 만듭니다-> <bean id = "sleephelper"/> <bean id = "lina"/> <!-포인트 절단 일치 모든 수면 메소드 정의-> <bean id = "sleeppointcut"> <property name = "pattern value =". 이름 = "조언"ref = "sleephelper"/<property name = "pointcut"ref = "sleeppointcut"/</bean> <!-프록시 객체를 정의합니다-> <bean id = "linaproxy"> <property name = "target"ref = "lina"/> <property name = "interceptorChortordames"value ""sleephelperadvisor "! value = "com.tgb.springaop.service.sleepable"/> -> </bean>
구성 파일에서와 같이 :
패턴 속성은 정규 표현식을 지정합니다. 모든 수면 방법과 일치합니다. org.springframework.aop.support.defaultpointcutadvisor를 사용하여 탄젠트 포인트와 향상을 결합하여 완전한 접선을 형성합니다. 최종 구성이 완료되면 org.springframework.aop.framework.proxyfactorybean을 통해 최종 프록시 객체가 생성됩니다.
2. 순수하고 간단한 자바 객체 패싯
순전히 간단한 자바 물체 패싯을 말하는 방법? 제 생각에는 프록시를 사용할 필요는 없지만 스프링의 내부 메커니즘을 통해 자동 스캔하는 첫 번째 구성과 관련이 있습니다. 현재 구성 파일을 다음과 같이 수정해야합니다.
<!-강화 조언을 만듭니다-> <bean id = "sleephelper"/> <!-대상 클래스-> <bean id = "lina"/> <!-포인트 컷 및 알림을 구성-> <bean id = "sleepadvisor"> <속성 이름 = "조언"ref = "sleephelper"> </propertion> <property name = "Pattern value ="-</bean 구성 "</bean 구성"</bean 구성. <bean/>
첫 번째 것보다 훨씬 간단합니까? 더 이상 프록시를 구성 할 필요가 없습니까?
3. @aspect 주석 양식
우리의 경험을 바탕으로, 우리는 주석의 형태가 구성 파일보다 간단하다는 것을 알고 있습니다. 현재 기존 방법이나 클래스에 대해 의견을 제시해야합니다.
/ ***주석을 통한 개선 추가*/ @aspect public class sleephelper03 {/* @pointcut ( "execution (*com.tgb.springaop.service.impl ..*())))*/ @pointcut ("**.slep (..)) public void sleeppoint ()}}} @} @( "sleeppoint (")). beforesleep () {System.out.println ( "수면 전에 얼굴 마스크를 적용"); } @afterReturning ( "sleeppoint ()") public void attsleep () {System.out.println ( "잠자는 후 꿈"); }
구성 파일로 작성하십시오.
<!-스캔 패키지-> <Context : Component-Scan Base-Package = "com.tgb"Annotation-Config = "True"/> <!-Sagne Annotation-> <aop : Sagej-AutoProxy proxy-target class = "true"/<!-target class-> <bean id = "lina"/>
4. 주입 형태의 ASPCET 절단 표면
나는 개인적으로 이것이 가장 단순하고 가장 일반적으로 사용되며 가장 유연하다고 생각합니다. 구성 파일은 다음과 같습니다.
<!-target class-> <bean id = "lina"/> <bean id = "sleephelper"/> <aop : config> <aop : 측면 ref = "sleephelper"> <aop : 이전 메소드 = "beforesleep"pointcut = "execution ( * * .sleep (..))"/> <aop : execution "( * * * * * ...)"). </aop : 측면> </aop : config>
구성 파일에 언급 된 Sleephelper02 클래스는 다음과 같습니다.
/ *** 주석을 통한 향상 추가*/ public class sleephelper02 {public void beforesleep () {System.out.println ( "수면 전에 얼굴 마스크를 적용"); } public void after sleep () {System.out.println ( "잠자는 후 꿈"); }}
매우 간단 해 보이나요? 모두 Spring AOP를 사용합니까? !
전화하는 방법과 관련하여 여기에 여러 테스트 수업을 썼습니다. 당신은 그것을 볼 수 있습니다. 기본적으로 동일합니다.
/ *** proxy를 통한 구성 파일 spring_aop.xml*/ @test public void test () {ApplicationContext ct = new ClassPathXmlApplicationContext ( "spring_aop.xml"); 잠자는 슬리퍼 = (잠자는) ct.getbean ( "linaproxy"); sleeper.sleep (); } / *** 구성 파일 Spring_aop_01.xml 짧은 답변 Java Object* / @test public void test01 () {ApplicationContext ct = new ClassPathXmlApplicationContext ( "spring_aop_01.xml"); 잠자는 슬리퍼 = (잠자는) ct.getbean ( "lina"); sleeper.sleep (); } / *** 구성 파일 spring_aop_03.xml agest* / @test public void test03 () {ApplicationContext ct = new ClassPathXmlApplicationContext ( "spring_aop_03.xml"); 잠자는 슬리퍼 = (잠자는) ct.getbean ( "lina"); sleeper.sleep (); } / *** 구성 파일 spring_aop_02.xml apsect를 통한 구성 파일* @author chen lina* @version 2015 년 5 월 31 일 오전 10:09:37 am* / @test public void test02 () {ApplicationContext ct = new ClassPathXmlapplicationContext ( "spring_aop_02.xml"); 잠자는 슬리퍼 = (잠자는) ct.getbean ( "lina"); sleeper.sleep (); }
테스트 클래스에서 우리는 AOP를 구현하는 방법에 상관없이 사용이 다르지 않음을 알 수 있습니다. 이 테스트 클래스의 결과는 동일합니다.