인 스 턴 스 를 통 해 Spring argNames 속성 을 분석 합 니 다.

5824 단어 SpringargNames
최근 에 Spring 을 공부 하면 서 Srping 의 절단면 프로 그래 밍 중의 argNames 의 의 미 를 잘 모 르 고 학습 연 구 를 통 해 알 게 되 었 습 니 다.공유 하 겠 습 니 다.
모니터링 이 필요 한 클래스:

package bean;
public class HelloApi {
  public void aspectTest(String a,String b){
    System.out.println("in aspectTest:" + "a:" + a + ",b:" + b);
  }
}
클래스 HelloApi 의 aspectTest 방법 은 모니터링 이 필요 한 방법 입 니 다.호출 전에 참 a 와 b 의 값 을 얻 고 인쇄 하 는 것 이 목표 입 니 다.
절단면 종류:

package aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.String;

@Component
@Aspect
public class HelloApiAspect2 {
  
  @Pointcut(value="execution(* bean.HelloApi.aspectTest(..)) && args(a1,b2)",argNames="a1,b2")
  public void pointcut1(String a1,String b2){}
  
  @Before(value="pointcut1(a,b)",argNames="a,b")
  public void beforecase1(String a,String b){
    System.out.println("1 a:" + a +" b:" + b);
  }
  //   beforecase1    argNames      
  @Before(value="pointcut1(a,b)",argNames="b,a")
  public void beforecase2(String a,String b){
    System.out.println("2 a:" + a +" b:" + b);
  }
}
테스트 클래스:

package UnitTest;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import bean.HelloApi;

public class Test1 {
  
  @Test
  public void aspectjTest1(){
    BeanFactory beanFactory = new ClassPathXmlApplicationContext("chapter2/aspectTest1.xml");
    HelloApi helloapi1 = beanFactory.getBean("helloapi1",HelloApi.class);
    helloapi1.aspectTest("a", "b");
  }
}
Spring 설정 파일 aspectTest.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:context="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-3.0.xsd
      http://www.springframework.org/schema/util
      http://www.springframework.org/schema/util/spring-util-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
  <context:component-scan base-package="aspect"></context:component-scan>
  
  <bean id="helloapi1" class="bean.HelloApi"></bean>
  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
출력:
2 a:b b:a
1 a:a b:b
in aspectTest:a:a,b:b
설명:
HelloApiAspect 2 는 절단면 pointcut 를 정의 합 니 다.절단면 표현 식 은 execution(*bean.HelloApi.aspectTest(..)&&args(a1,b2)이 며,bean.HelloApi.aspectTest()방법 을 나타 내 며,입력 매개 변 수 는 2 개 입 니 다.
args(a1,b2)의 또 다른 역할 은 aspectTest(String a,String b)방법 에 대응 하 는 표현 식 args(a1,b2)를 정의 하 는 것 입 니 다.args(a1,b2)를 정의 해 야 목표 방법 aspectTest 의 매개 변 수 를 절단면 방법 beforecase 1 의 매개 변수 에 전달 할 수 있 습 니 다.a 매개 변 수 는 a1,b 매개 변 수 는 b2 에 대응 합 니 다.사용 하 는 방법 은 순서대로 대응 하 는 것 입 니 다.aspectTest 의 첫 번 째 매개 변 수 는 args 의 첫 번 째 매개 변수,aspectTest 의 두 번 째 매개 변 수 는 args 의 두 번 째 매개 변수 입 니 다.
argNames 는 선택 할 수 있 습 니 다.argNames 라 는 인자 가 없 으 면 컴 파일 러 가[class 파일 에서 변수 디 버 깅 정 보 를 생 성 합 니 다]를 설정 하면 spring 은 방법 매개 변수의 이름 을 반사 적 으로 알 수 있 습 니 다.이름 을 통 해 짝 을 맞 출 수 있 습 니 다.Spring 은 args(a1,b2)표현 식 의 a1 과 b2 를 알 고 pointcut 1(String a1,String b2)방법 중의 a1 과 b2 에 대응 합 니 다.
대상 방법 과 삽입 방법의 매개 변수의 관 계 는 이렇게 확립 되 었 다.aspectTest(String a,String b)와 args(a1,b2)의 관 계 는 a 대 a1,b 대 b2(),args(a1,b2)와 pointcut 1(String a1,String b2)의 관 계 는 args 의 a1 대 pointcut 1 의 a1,args 의 a2 대 pointcut 1 의 a2 이다.목표 방법의 매개 변수 가 접근 방법의 매개 변수 로 들 어 오 는 문 제 를 해결 했다.
단,argNames 를 설정 하면 Spring 은 방법 매개 변수의 이름 을 사용 하지 않 고 argNames 가 정의 하 는 순 서 를 사용 하여 pointcut 1(String a1,String b2)의 순 서 를 정의 합 니 다.예 를 들 어 argNames="a1,b2",a1 은 b2 앞에서 pointcut 1 방법의 첫 번 째 매개 변 수 는 a1 이 고 두 번 째 매개 변 수 는 b2 입 니 다.
argNames 를 설정 하지 않 은 이상 Spring 은 매개 변수 이름 에 따라 짝 을 맞 출 수 있 습 니 다.왜 argNames 를 설정 해 야 합 니까?Spring 이 방법의 매개 변수 이름 을 알 아야 하기 때문에 컴 파 일 러 는[class 파일 에서 변수 디 버 깅 정 보 를 생 성 합 니 다]를 설정 해 야 합 니 다.설정 하지 않 으 면 Spring 은 pointcut 1 방법의 매개 변수 이름 을 모 릅 니 다.이때 Spring 은 매개 변수의 유형 만 알 고 Spring 은 매개 변수의 유형 을 사용 하여 짝 짓 기 를 합 니 다.만약 에 2 개의 매개 변수 가 모두 같은 유형의 상황 이 발생 하면AmbiguousBinding Exception 이상 을 알 리 겠 습 니 다.
beforecase 1 과 beforecase 2 의 argNames 설정 순서 가 바 뀌 었 습 니 다.beforecase 1 을 호출 하 는 순 서 는 beforecase 1("a","b")이 고,beforecase 2 를 호출 하 는 순 서 는 beforecase 2("b","a")이기 때문에 마지막 출력 은
2 a:b b:a
1 a:a b:b
PS:
[class 파일 에서 변수 디 버 깅 정 보 를 생 성 합 니 다]my eclipse 에서 windows-preferences 를 열 고 다음 과 같이 설정 합 니 다.

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기