인 스 턴 스 를 통 해 Spring 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 를 열 고 다음 과 같이 설정 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.