Spring AOP 입문 데모 공유

본 고 를 읽 기 전에 먼저 라 는 글 을 참고 하여 ioc 와 op 의 관련 내용 을 간단하게 이해 할 수 있 습 니 다.본론 으로 들 어가 보 겠 습 니 다.
본 고 는 Spring 의 AOP 특성 을 사용 하여 Spring AOP 의 입문 데모 라 고 할 수 있 는 가장 간단 한 예 를 하나씩 만 들 것 이다.초보 자로 서 이렇게 간단 한 데 모 를 운영 하 는 것 도 많은 구 덩이 를 밟 았 다.
OOP 의 문제, AOP 의 보충
우리 가 분 산 된 대상 을 위해 공공 행 위 를 도입 해 야 할 때 OOP 는 무력 해 보인다.즉, OOP 는 위 에서 아래로 의 관 계 를 정의 할 수 있 지만 왼쪽 에서 오른쪽으로 의 관 계 를 정의 하 는 데 적합 하지 않다 는 것 이다.예 를 들 어 로그 기능.로그 코드 는 모든 대상 차원 에 수평 으로 흩 어 져 있 으 며, 흩 어 져 있 는 대상 의 핵심 기능 과 는 무관 합 니 다.안전성, 이상 처리, 투명 한 지속 성 등 다른 유형의 코드 도 마찬가지다.곳곳에 흩 어 져 있 는 무관 한 코드 를 가로 자 르 기 (cross - cutting) 코드 라 고 하 는데 OOP 디자인 에서 대량의 코드 가 중복 되 어 각 모듈 의 재 활용 에 불리 하 다.
이른바 '방면' 이란 쉽게 말 하면 업무 와 무관 하지만 업무 모듈 에 공동으로 호출 되 는 논리 나 책임 을 봉인 하여 시스템 의 중복 코드 를 줄 이 고 모듈 간 의 결합 도 를 낮 추 며 미래의 조작 성과 유지 가능성 에 유리 하 다 는 것 이다.
Spring 에서 AOP 에 대한 지원
Spring 중 AOP 에이 전 트 는 Spring 의 IoC 용기 가 생 성 · 관 리 를 맡 고 그 의존 관계 도 IoC 용기 가 관리한다.따라서 AOP 에이 전 트 는 용기 에 있 는 다른 Bean 인 스 턴 스 를 대상 으로 직접 사용 할 수 있 으 며, 이러한 관 계 는 IoC 용기 의 의존 주입 에 의 해 제 공 될 수 있다.Spring 은 기본적으로 자바 동적 대 리 를 사용 하여 AOP 대 리 를 만 듭 니 다. 그러면 모든 인터페이스 인 스 턴 스 에 대 리 를 만 들 수 있 습 니 다.프 록 시가 필요 한 클래스 가 프 록 시 인터페이스 가 아 닐 때 Spring 은 자동 으로 CGLIB 프 록 시 로 전환 되 고 CGLIB 를 강제로 사용 할 수도 있 습 니 다.
이 예 의 논 리 는 다음 과 같다. 하나의 Car 류 (업무 류) 가 있 는데 Car 류 의 go 방법 이 실행 되 기 전과 그 후에 해당 하 는 로그 기록 이 있 지만 Car 류 자 체 는 로그 의 어떠한 논리 도 모른다.
Maven 프로젝트 를 만 들 고 의존 도 를 추가 합 니 다.
우선 Maven 프로젝트 를 새로 만 들 고 Maven \ archetype \ \ quickstart 템 플 릿 을 사용 한 다음 pom. xml 파일 을 열 고 Spring AOP 실행 에 필요 한 의존 팩 을 추가 합 니 다.


  org.springframework
  spring-core
  4.0.5.RELEASE


  org.springframework
  spring-beans
  4.0.5.RELEASE


  org.springframework
  spring-context
  4.0.5.RELEASE


  org.springframework
  spring-aop
  4.0.5.RELEASE


  org.aspectj
  aspectjweaver
  1.8.1

비 즈 니스 코드 작성
go () 방법 을 포함 하여 업무 클래스 Car 를 추가 합 니 다.

package com.wowo.spring_aop_demo1;
public class Car {
  public void go(){
    System.out.println("go go go!");
  }
}

절단면 클래스 작성
로그 류 는 시스템 의 운행 상황 을 기록 하지만 로그 의 논 리 는 업무 류 에 곳곳에 쓰 이지 않 고 절단면 류 로 존재 합 니 다.

package com.wowo.spring_aop_demo1;
public class CarLogger {
  public void beforeRun(){
    System.out.println("car is going to run");
  }
  public void afterRun(){
    System.out.println("car is running");
  }
}

이 절단면 류 는 두 가지 방법 을 포함 하 는데, 그들 은 각각 사전 통지 와 사후 통지 이다.
bean 을 통 해 연결 설정 하기
설정 파일 을 추가 합 니 다. 이 예 는 bean. xml 이 라 고 명명 되 었 습 니 다. 설정 파일 에서 절단면 과 알림 을 연결 합 니 다.



  
  
  
    
      

      
      
    
  

메모: 이 프로필 에는 op 의 네 임 스페이스 와 xsi: schema Location 에 포 함 된 몇 개의 주소 가 필요 합 니 다.execution (* com. wowowo. spring aop demo1. Car. go (..) 는 AspectJ 절 점 표현 식 입 니 다. execution 은 실행 할 때 촉발 하고 뒤의 * 는 임의의 형식의 반환 값 을 표시 합 니 다. com. wowo. springaop_demo 1. Car 는 접점 이 있 는 클래스 를 말 합 니 다. go (..) 는 방법 명 입 니 다. 임 의 매개 변 수 를 표시 합 니 다.
Spring 절단면 은 5 가지 유형의 알림 을 사용 할 수 있 습 니 다.
방법 이 호출 되 기 전에 통 지 · After ― 방법 이 완 료 된 후에 통 지 를 호출 합 니 다. 방법 이 성공 하 든 안 하 든 After - returning ― 방법 이 성공 적 으로 실 행 된 후에 통 지 를 호출 합 니 다. After - throwing ― 방법 이 이상 한 것 을 던 진 후에 통 지 를 호출 합 니 다. Around ― 통 지 된 방법 을 소 포 했 습 니 다.통 지 된 방법 이 호출 되 기 전과 호출 된 후에 사용자 정의 행동 을 수행 합 니 다.
실행 업무 코드
업무 코드 를 실행 하기 위해 main () 방법 을 포함 하 는 클래스 를 만 듭 니 다.

package com.wowo.spring_aop_demo1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App 
{
  public static void main( String[] args )
  {
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Car car=(Car) context.getBean("car");
    car.go();
  }
}

위의 코드 에서 Spring 에서 car 대상 을 만 들 었 습 니 다.Spring 은 이 대상 을 만 들 때 하나의 방법 이 접점 (pointcut) 으로 설정 되 어 있 음 을 발 견 했 습 니 다. 따라서 이 대상 을 예화 할 때 프 록 시 대상 을 만 듭 니 다. 접점 방법 go () 가 실 행 될 때 Spring 이 만 든 프 록 시 대상 에 의 해 차단 되 고 go 방법 을 실행 하기 전에 해당 하 는 절단면 류 CarLogger 의 사전 방법 beforeRun () 을 호출 한 다음 Car. go () 를 호출 합 니 다.방법, 그리고 절단면 류 CarLogger 의 백 엔 드 방법 after Run () 을 호출 합 니 다.
메모: Spring 을 사용 하여 접점 을 포함 하 는 대상 을 만들어 야 합 니 다. 만약 에 자신 이 만 들 면 Spring 은 모니터링 되 지 않 고 실행 에 대해 어떠한 알림 도 적용 되 지 않 습 니 다.
프로젝트 출력 결과

car is going to run
go go go!
car is running

서 라운드 알림 사용
서 라운드 알림 을 사용 하려 면 절단면 류 의 알림 방법 과 설정 파일 을 수정 해 야 합 니 다. 업무 류 는 수정 할 필요 가 없습니다. 왜냐하면 그들 은 완전히 결합 을 풀 었 기 때 문 입 니 다.먼저 절단면 류 CarLogger 를 수정 합 니 다.

import org.aspectj.lang.ProceedingJoinPoint;
public class CarLogger {

  public void aroundRun(ProceedingJoinPoint joinpoint){
    System.out.println("car is going to run");
    try {
      //             ,     Car.go()  
      joinpoint.proceed();
    } catch (Throwable e) {
      e.printStackTrace();
    }
    System.out.println("car is running");
  }
}

서 라운드 알림 방법 은 ProceedingJoinPoint 형식의 인 자 를 받 아들 여야 합 니 다. proceed () 방법 은 대리 대상 의 목표 방법 을 호출 할 것 입 니 다. 따라서 정상 적 인 상황 에서 이 방법 은 반드시 호출 되 어야 합 니 다.우리 도 이 방법 을 사용 하지 않 고 대리 대상 의 운행 을 조직 할 수 있다.
다음은 프로필 의 op: config 부분 을 다음 과 같이 수정 합 니 다.


    
      
      
    
  

메모: 서 라운드 알림 은 사전 / 사후 알림 과 동시에 존재 할 수 없습니다.코드 를 실행 한 후 출력 결 과 는 변 하지 않 습 니 다.
총결산
스프링 AOP 입문 데모 에 관 한 본 고의 모든 내용 입 니 다. 도움 이 되 셨 으 면 합 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 주 제 를 계속 참고 할 수 있 습 니 다. 부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기