이 기사를 읽기 전에 IOC 및 AOP의 관련 내용을 간단히 이해하려면 " Spring 's IOC 및 AOP 및 코드 예제에 대한 간단한 이해 " 기사를 참조하십시오. 주제에 접근합시다.
이 기사는 Spring AOP의 초보자 데모로 간주되는 Spring의 AOP 기능을 사용하기 위해 가장 간단한 예제를 단계별로 만듭니다. 초보자로서, 그러한 간단한 데모를 실행하는 것도 많은 함정에 맞았습니다.
OOP의 문제, AOP 보충
흩어진 물체에 대중의 행동을 도입해야 할 때 OOP는 무력한 것 같습니다. 즉, OOP를 사용하면 관계를 위에서 아래로 정의 할 수 있지만 왼쪽에서 오른쪽으로 관계를 정의하는 데 적합하지 않습니다. 예를 들어 로깅 기능. 로그 코드는 종종 산란 된 객체의 핵심 기능과 관련이없이 모든 객체 수준에 걸쳐 수평으로 흩어져 있습니다. 보안, 예외 처리 및 투명성과 같은 다른 유형의 코드에 대해서도 마찬가지입니다. 모든 곳에서 흩어져있는 이러한 종류의 관련없는 코드를 크로스 절단 코드라고합니다. OOP 설계에서는 많은 코드 복제를 유발하며 각 모듈의 재사용에는 도움이되지 않습니다.
소위 "측면"은 간단히 말하면 비즈니스와 관련이 없지만 비즈니스 모듈에 의해 공동으로 호출되는 논리 또는 책임을 캡슐화하여 시스템의 코드 복제를 줄이고 모듈 간의 커플 링을 줄이며 미래 운영 성과 유지 관리를 촉진합니다.
봄에 AOP 지원
Spring의 AOP 에이전트는 Spring의 IOC 컨테이너의 생성 및 관리를 담당하며 그 종속성은 IOC 컨테이너에 의해 관리됩니다. 따라서 AOP 프록시는 컨테이너의 다른 Bean 인스턴스를 직접 타겟팅 할 수 있으며,이 관계는 IOC 컨테이너의 의존성 주입에 의해 제공 될 수 있습니다. Spring은 Java Dynamic Proxy를 사용하여 기본적으로 AOP 프록시를 만들어 모든 인터페이스 인스턴스에 대한 프록시를 만들 수 있습니다. 프록시가 필요한 클래스가 프록시 인터페이스가 아닌 경우 Spring은 자동으로 CGLIB 프록시로 전환되며 CGLIB를 강제 할 수도 있습니다.
이 예제의 논리는 다음과 같습니다. 자동차 수업 (비즈니스 클래스)이 있습니다. 자동차 클래스의 GO 메소드 전후에 실행되면 해당 로그 레코드가 있지만 자동차 클래스 자체는 로그의 논리를 알지 못합니다.
Maven 프로젝트를 만들고 종속성을 추가하십시오
먼저 새 Maven 프로젝트를 만들고 mavenarchetypequickstart 템플릿을 사용한 다음 pom.xml 파일을 열고 Spring AOP가 실행하는 데 필요한 종속성 패키지를 추가하십시오.
<pectionency> <groupId> org.springframework </groupid> <artifactid> spring-core </artifactid> <버전> 4.0.5. release </version> </dependency> <prectionency> <groupid> org.springframework </groupid> <artifactid> spring-beans </artifactid> <버전 </version> 5.0.5.release <groupid> org.springframework </groupid> <artifactid> spring-context </artifactid> <bersion> 4.0.5. release </version> </dependency> <prectionemency> <groupid> org.springframework </groupId> <artifactid> spring-context </expence- <버전> 4.0.5. 5. release <groupid> org.springframework </groupid> <artifactid> spring-aop </artifactid> <bersion> 4.0.5. release </version> </fectionency> <groupdency> <groupid> org.aspectj </groupid> <artifactid> agagjweaver </artifactid> <8.1 </deption>
비즈니스 코드 작성
go () 메소드를 포함한 비즈니스 클래스 차량을 추가했습니다
package com.wowo.spring_aop_demo1; public class car {public void go () {system.out.println ( "Go Go!"); }}패싯을 작성하십시오
로그 클래스는 시스템의 작동을 기록하지만 로그 로직은 비즈니스 클래스의 어느 곳에서나 기록되지 않지만 패싯 클래스로 존재합니다.
package com.wowo.spring_aop_demo1; public class carlogger {public void beforerun () {System.out.println ( "CAR IS will will run"); } public void afterrun () {System.out.println ( "자동차가 실행 중"); }}이 측면 클래스에는 두 가지 방법, 즉 사전 사전화와 사후 개조가 포함되어 있습니다.
콩을 통한 연관성을 구성하십시오
이 예제에서 bean.xml이라는 새 구성 파일이 추가되어 구성 파일에서 얼굴과 알림을 연관시킵니다.
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : p = "http://www.springframework.org/schema/p"xmlns : context = "http://www.springframework.org/schema/context"xmlns : aop = "http://www.springframwork.org/schema/op" xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.xsd http://www.springframework.org/schema/contet http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/sprring-aop-aop.xsd "> <"> id = "logger" /> <aop : config> <aop : 측면 ref = "logger"> <aop : pointcut expression = "execution (* com.wowo.spring_aop_demo1.car.go (* com.wowo.spring_aop_demo1.go (go))"go " /<aop : pointcut-ref ="go ""beforerun ""aop : "aop :"aop : "aop :"go " /<aop :"go " /> <aop :"go " /<aop :"go " /<aop :"go ". 메소드 = "Afterrun"/> </aop : 측면> </aop : config> </beans>
참고 :이 구성 파일에서 XSI에 포함 된 AOP의 네임 스페이스 및 여러 주소가 필요합니다.
execution (* com.wowo.spring_aop_demo1.car.go (..))는 SpectJ Point-Cut 표현식입니다. 실행은 실행 중 트리거링을 의미합니다. 다음 *은 모든 유형의 반환 값을 나타냅니다. com.wowo.spring_aop_demo1.car는 Point-Cut이 위치한 클래스를 나타냅니다. go (..)는 메소드 이름이며 ... 모든 매개 변수를 나타냅니다.
스프링 섹션에 적용 할 수있는 5 가지 유형의 알림이 있습니다.
・전-메소드가 호출되기 전에 전화 통지가 호출됩니다
・후-방법이 성공적으로 실행되는지 여부에 관계없이 메소드가 완료된 후 알림이 호출됩니다.
hetter 퇴행 후-메소드가 성공적으로 실행 된 후에 전화 통지가 호출됩니다.
・시간 후-메소드가 예외를 던진 후에 전화 통지
주변 -주변-Notification은 알림 메소드를 패키지하고 알려진 메소드 호출 전후에 사용자 정의 동작을 수행합니다.
비즈니스 코드를 실행하십시오
아래는 비즈니스 코드를 실행하는 Main () 메소드가 포함 된 클래스입니다.
패키지 com.wowo.spring_aop_demo1; import org.springframework.context.applicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; public class app {public static void main (] argss) {새로운 context = new classPathXmlApplicationContext ( "bean.xml"); 자동차 자동차 = (자동차) context.getBean ( "CAR"); 뱃짐(); }}위의 코드에서 자동차 객체는 스프링에 의해 생성됩니다. Spring 이이 객체를 생성하면 해당 메소드 중 하나가 PointCut으로 구성되어 있음을 알게됩니다. 따라서 객체를 인스턴스화 할 때 프록시 객체가 생성됩니다. Point-Cut 메소드가 Go ()가 실행되면 Spring에 의해 생성 된 프록시 객체에 의해 차단됩니다. GO 메소드를 실행하기 전에 해당 프리 프로세스 Carlogger의 해당 프리 프로세스 Beforerun ()을 호출 한 다음 Car.go () 메소드를 호출 한 다음 섹션 절단 클래스 Carlogger Afterrun ()의 후 프로세스를 호출합니다.
참고 : 스프링은 탄젠트가 포함 된 물체를 만드는 데 사용해야합니다. 직접 작성하면 Spring은 모니터링 할 수 없으며 응용 프로그램을 적용하여 해당 작업에 통보되지 않습니다.
프로젝트의 출력 결과는 다음과 같습니다
자동차가 갈거야! 자동차가 달리고있다
서라운드 알림을 사용하십시오
서라운드 알림을 사용하려면 Aspect 클래스에서 알림 메소드 및 구성 파일을 수정해야합니다. 비즈니스 클래스는 완전히 분리되었으므로 수정할 필요가 없습니다. 먼저 섹션 클래스 Carlogger를 수정하십시오
import org.aspectj.lang.proceedingjoinpoint; public class carlogger {public void atrun (proceedingjoinpoint joinpoint) {System.out.println ( "자동차가 실행될 예정"); try {// 프록시 오브젝트의 대상 메소드를 호출 하고이 예에서는 car.go () 메서드 jointpoint.proceed (); } catch (Throwable e) {e.printstacktrace (); } system.out.println ( "자동차가 실행 중입니다"); }}알림을 둘러싼 메소드는 ProceedingJoinPoint 유형의 매개 변수를 수락해야하며, Process () 메소드는 프록시 오브젝트의 대상 메소드를 호출하므로 정상적인 상황에서는이 방법을 호출해야합니다. 또한이 방법을 호출하지 않음으로써 프록시 객체의 실행을 구성 할 수도 있습니다.
다음으로 AOP : 구성 파일의 구성 부분을 다음과 같이 수정하십시오.
<aop : config> <aop : agage ref = "logger"> <aop : pointcut expression = "execution (* com.wowo.spring_aop_aop_aop_aop_aop_demo1.car.go (..))"go "/> <aop : 주변 메소드 ="Art
참고 : 서라운드 알림은 전면/후면 알림과 동시에 존재할 수 없습니다. 코드를 실행 한 후에는 출력 결과가 변경되지 않았습니다.
요약
위의 내용은 Spring AOP 데모 소개에 관한이 기사에서 공유하는 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!