Spring AOP 에서 자주 사용 하 는 네 가지 실현 방식

Spring 은 AOP 의 네 가지 방식 을 실현 합 니 다.
AOP 관련 용어 먼저 알 아 보기:
1. 알림 (조언):
절단면 이 무엇 인지, 언제 사용 하 는 지 알려 줍 니 다.절단면 이 완성 해 야 할 일과 언제 이 일 을 수행 해 야 하 는 지 를 묘사 했다.
2. 연결 점 (Joinpoint):
프로그램 이 알림 을 적용 할 수 있 는 '타 이 밍' 은 바로 연결 점 이다. 예 를 들 어 방법 이 호출 되 었 을 때, 이상 이 던 져 졌 을 때 등 이다.
3. 삽입점 (Pointcut)
알림 은 절단면 에서 발생 할 '이야기' 와 시간 을 정의 합 니 다. 그러면 접점 은 '이야기' 가 발생 하 는 장 소 를 정의 합 니 다. 예 를 들 어 특정한 종류 나 방법의 이름, Spring 에 서 는 정규 표현 식 으로 편리 하 게 지정 할 수 있 습 니 다.
4. 절단면 (가로)
통지 와 착안점 은 공동으로 절단면 을 구성 했다. 시간, 장소 와 발생 할 '이야기' 이다.
5. 도입 (소개)
기 존의 클래스 에 새로운 방법 과 속성 을 추가 할 수 있 도록 도입 합 니 다 (Spring 은 하나의 방법 으로 주입 하 는 기능 을 제공 합 니 다)
6. 목표 (대상)
즉, 통 지 된 대상 이 AOP 가 없 으 면 그 논 리 는 다른 사무 논 리 를 교차 시 킬 것 이다. AOP 가 있 으 면 자신 이 해 야 할 일 에 만 관심 을 가 질 수 있다.
7. 에이전트 (프 록 시)
알림 대상 을 사용 하고 상세 한 내용 은 디자인 모델 의 대리 모델 을 참조 합 니 다.
8. 뜨개질 (Weaving)
절단면 을 대상 에 적용 하여 새로운 프 록 시 대상 을 만 드 는 과정 은 일반적으로 다음 과 같은 몇 가지 시기 에 발생 합 니 다.
(1) 컴 파일 시: 하나의 파일 이 컴 파일 될 때 짜 기 를 합 니 다. 이것 은 특별한 컴 파일 러 가 필요 합 니 다. 예 를 들 어 AspectJ 의 짜 기 컴 파일 러 등 입 니 다.
(2) 클래스 로 딩 시: 특수 한 ClassLoader 를 사용 하여 대상 클래스 가 프로그램 에 불 러 오기 전에 클래스 의 바이트 코드 를 강화 합 니 다.
(3) 운행 시: 절단면 은 운행 하 는 어느 순간 에 짜 여 져 있 고 SpringAOP 는 이런 방식 으로 절단면 을 짜 는 것 입 니 다. 원 리 는 JDK 의 동적 에이전트 기술 을 사용 한 것 같 습 니 다.
Spring 은 AOP 를 실현 하 는 4 가지 방식 을 제공 합 니 다.
1. 고전적 인 에이전트 기반 AOP
2. @ AspectJ 주해 구동 의 절단면
3. 순수한 뽀 조 칼국수
4. 주입 식 AspectJ 절단면
우선 프 록 시 기반 의 전형 적 인 AOP 를 살 펴 보 자.
Spring 은 다섯 가지 유형의 알림 을 지원 합 니 다.
Before (전)  org.apringframework.aop.MethodBeforeAdvice
After - returning (반환 후) org. springframework. aop. After Returning Advice
After - throwing (던 진 후) org. springframework. aop. ThrowsAdvice
Arround (주위) org. aopaliance. intercept. MethodInterceptor
Introduction (도입) org. springframework. aop. IntroductionInterceptor
값 은 주위 알림 을 설명 합 니 다. 그 는 AOP Alliance 의 인터페이스 에 의 해 정 의 된 것 이지 Spring 이 아 닙 니 다. 주위 알림 은 전 알림, 반환 후 알림, 던 진 후 알림 의 결합 (전설의 완전 체? 좋 습 니 다. 날 과 날 이 많 습 니 다.
) 그리고 도입 알림 을 어떻게 하 는 지 아직 잘 모 르 겠 어 요. 잡념 이 없 을 때 놀아 요.
이 물건 은 어떻게 합 니까? 이렇게 몇 단계:
1. 알림 만 들 기: 이 몇 개의 인 터 페 이 스 를 실현 하고 그 중의 방법 을 실현 합 니 다.
2. 접점 과 알림 을 정의 합 니 다: Spring 배합 파일 에 이 정 보 를 설정 합 니 다.
3. 프 록 시 팩 터 리 빈 을 사용 하여 프 록 시 생 성
구체 적 인 방법.
먼저 인 터 페 이 스 를 Sleepable 이 라 고 쓰 십시오. 이것 은 소 X 의 인터페이스 입 니 다. 잠 자 는 능력 을 가 진 모든 것 이 이 인 터 페 이 스 를 실현 할 수 있 습 니 다. (생물 뿐만 아니 라 전원 끄 기 옵션 의 휴면 도 포함 합 니 다)

package test.spring.aop.bean

public interface Sleepable{
 
    void sleep(); 
}

그리고 Human 류 를 써 서 그 는 이 인 터 페 이 스 를 실현 했다.

package test.spring.aop.bean

public Human implements Sleepable{
   
   /*          ?
    *                    ?*/
   public void sleep(){
      System.out.println("   !       !");
   }

}

자, 이것 은 주인공 이지 만 잠 을 자 는 전후 에 보조 업 무 를 해 야 한다. 가장 기본 적 인 것 은 옷 을 벗 고 잠 을 이 루 지 못 하 는 사람 은 수면 제 를 먹 어야 한다. 그러나 이런 동작 들 은 순수한 잠 이라는 '업무 논리' 와 무관 하 다. 만약 에
이 코드 들 을 모두 sleep 방법 에 넣 으 면 단일 직책 에 어 긋 나 지 않 습 니까? 이 럴 때 우 리 는 AOP 가 필요 합 니 다.
SleepHelper 클래스 를 만 듭 니 다. 잠 자 는 보조 작업 이 포함 되 어 있 습 니 다. AOP 용어 로 는 알림 이 어야 합 니 다. 위의 인 터 페 이 스 를 실현 해 야 합 니 다.

package test.spring.aop.bean;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

public class SleepHelper implements MethodBeforeAdvice,AfterReturningAdvice{

    public void before(Method mtd, Object[] arg1, Object arg2)
            throws Throwable {
        System.out.println("             !");
    }

    public void afterReturning(Object arg0, Method arg1, Object[] arg2,
            Object arg3) throws Throwable {
        System.out.println("        !");
    }
    
}

그리고 spring 프로필 에서 설정 합 니 다:

<bean id="sleepHelper" class="test.spring.aop.bean.SleepHelper">
</bean>

OK! 이제 알림 을 만 드 는 작업 이 완료 되 었 습 니 다.
두 번 째 단 계 는 설정 입 니 다. 이것 은 매우 아 픈 작업 입 니 다. 특히 이렇게 더 운 날 에 Spring 은 물건 의 이름 을 귀신 처럼 길 게 지 었 습 니 다. 그것 은 왜 usr 와 같은 스타일 을 할 수 없 습 니까?
먼저 해 야 할 일 은 절 점 을 설정 하 는 것 입 니 다. 절 점 의 표현 방식 은 Spring 에 여러 가지 가 있다 고 합 니 다. 그러나 자주 사용 하 는 것 은 두 가지 뿐 입 니 다. 1. 정규 표현 식 을 사용 합 니 다. 2. AspectJ 표현 식 AspectJ 를 사용 하 는 것 은 잘 모 릅 니 다. (저도 잘 알 고 있 습 니 다.)
당 or 당 에 정통 합 니까?) 저 는 정규 표현 식 을 사용 하 는 것 이 습관 입 니 다.
Spring 은 org. springframework. aop. support. JdkRegexpMethodPointcut 을 사용 하여 정규 표현 식 절 점 을 정의 합 니 다.

<bean id="spleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
  <property name="pattern" value=".*sleep"/>
</bean>

pattern 속성 은 정규 표현 식 을 지정 합 니 다. 모든 sleep 방법 과 일치 합 니 다.
절 점 은 이야기 가 발생 하 는 장소, 그리고 이야기 가 발생 하 는 시간 과 가장 중요 한 이야기 의 내용 을 정의 하 는 것 이다. 바로 통지 이다. 우 리 는 통지 와 절 점 을 결합 시 켜 야 한다. 우리 가 사용 해 야 할 통지 자 는:

org.springframework.aop.support.DefaultPointcutAdvisor

<bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
     <property name="advice" ref="sleepHelper"/>
     <property name="pointcut" ref="sleepPointcut"/>
</bean>

접근 점 과 알림 설정 이 완료 되 었 습 니 다. 다음 프 록 시 Factory Bean 을 호출 하여 프 록 시 대상 을 만 듭 니 다.

<bean id="humanProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
     <property name="target" ref="human"/>
     <property name="interceptorNames" value="sleepHelperAdvisor" />
     <property name="proxyInterfaces" value="test.spring.aop.bean.Sleepable" />
</bean>

Proxy Factory Bean 은 프 록 시 인터페이스 에서 지정 한 인 터 페 이 스 를 실현 하 는 프 록 시 대상 으로 변환 할 수 있 는 에이전트 입 니 다.

import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.spring.aop.bean.Sleepable;


public class Test {

    public static void main(String[] args){
        ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Sleepable sleeper = (Sleepable)appCtx.getBean("humanProxy");
        sleeper.sleep();
    }
}

프로그램 실행 결과:
보통 자기 전에 옷 을 벗 어야 해 요!
자 요 ~ 꿈속 에 얼굴 이 옥 처럼 생 겼 어 요!
일어나 서 옷 부터 입 어야 돼!
OK! 이것 은 우리 가 원 하 는 결과 입 니 다. 그러나 위의 과정 은 좀 복잡 한 것 같 습 니 다. 특히 설정 절 점 과 알림, Spring 은 자동 프 록 시 기능 을 제공 하여 절 점 과 알림 이 자동 으로 일치 하도록 합 니 다. 설정 파일 을 수정 하 는 것 은 다음 과 같 습 니 다.

 <bean id="sleepHelper" class="test.spring.aop.bean.SleepHelper">
  </bean>
  <bean id="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice" ref="sleepHelper"/>
    <property name="pattern" value=".*sleep"/>
  </bean>
  <bean id="human" class="test.spring.aop.bean.Human">
  </bean>
  <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

실행 프로그램:

public class Test {

    public static void main(String[] args){
        ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Sleepable sleeper = (Sleepable)appCtx.getBean("human");
        sleeper.sleep();
    }
}

성공 출력 결 과 는 앞 과 같 습 니 다!
org. spring framework. aop. framework. autoproxy. default Advisor AutoProxy Creator (내 가 졸 랐 는데 이름 이 너무 길 어) 를 설명 하면 방법 에 맞 는 bean 자동 으로 대 리 를 만 들 수 있 습 니 다!
그래도 해 야 할 일이 많아 요. 더 쉬 운 방법 이 있 나 요? 있 습 니 다!
한 가지 방식 은 AspectJ 가 제공 하 는 주 해 를 사용 하 는 것 입 니 다.

package test.mine.spring.bean;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class SleepHelper {

    public SleepHelper(){
        
    }
    
    @Pointcut("execution(* *.sleep())")
    public void sleeppoint(){}
    
    @Before("sleeppoint()")
    public void beforeSleep(){
        System.out.println("       !");
    }
    
    @AfterReturning("sleeppoint()")
    public void afterSleep(){
        System.out.println("       !");
    }
    
}

@ Aspect 의 주석 으로 절단면 을 표시 합 니 다. 빠 뜨리 지 않도록 주의 하 십시오. 그렇지 않 으 면 Spring 이 대 리 를 만 들 때 찾 을 수 없습니다. @ Pointcut 주석 은 접점 을 지정 하 였 습 니 다. @ Before 와 @ AfterReturning 은 실행 시의 알림 을 지정 하 였 습 니 다.
주해 에 절 점 의 이름 을 넣 어야 한 다 는 뜻 입 니 다.
그 다음 에 저 희 는 Spring 프로필 에 공 을 들 였 습 니 다. 먼저 AOP 의 XML 네 임 스페이스 를 늘 리 고 관련 schema 를 설명 하 는 것 입 니 다.
네 임 스페이스:
xmlns:aop="http://www.springframework.org/schema/aop"
schema 선언:
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
그리고 이 라벨 을 추가 합 니 다.
< op: aspectj - autoproxy / > 이 Spring 이 있 으 면 @ Aspect 에 표 시 된 절단면 을 자동 으로 검색 할 수 있 습 니 다.
마지막 으로 운행 입 니 다. 아주 간단 하고 편리 합 니 다.

public class Test {

    public static void main(String[] args){
        ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Sleepable human = (Sleepable)appCtx.getBean("human");
        human.sleep();
    }
}


다음은 AOP 를 실현 하 는 마지막 방법 을 살 펴 보 겠 습 니 다. Spring 을 사용 하여 순수한 POJO 절단면 을 정의 합 니 다.
앞에서 우 리 는 < op: aspectj - autoproxy / > 라벨 을 사 용 했 습 니 다. Spring 은 op 의 네 임 스페이스 에서 다른 설정 요 소 를 제공 합 니 다.
< op: advisor > AOP 알림 자 정의
< op: after > 후 알림
< op: after - returning > 반환 후 알림
< op: after - throwing > 던 진 후 알림
< op: around > 주위 알림
< op: aspect > 절단면 정의
< op: before > 이전 알림
< aop: config > 최고급 설정 요소, < beans > 와 유사 한 것
< op: pointcut > 절 점 정의
우 리 는 AOP 라벨 로 잠 을 자 는 과정 을 실현 한다.
코드 가 변 하지 않 습 니 다. 설정 파일 만 수정 하고 AOP 설정 을 추가 하면 됩 니 다.

<aop:config>
    <aop:aspect ref="sleepHelper">
    <aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>
    <aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>
    </aop:aspect>
</aop:config>

좋은 웹페이지 즐겨찾기