자바 주석 및 Spring 의@Autowired 가 어떻게 실현 되 었 는 지 이해 합 니 다.
5600 단어 자바Spring@Autowired
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoSample {
String value();
}
주 해 는@interface
로 표시 한다.이 주 해 는 하나의 속성 value 를 정의 합 니 다.방법 에 만 작용 할 수 있 고 생명 주 기 는 실행 할 때 입 니 다.@Target 은 주석 을 놓 을 수 있 는 위 치 를 지정 하 는 데 사 용 됩 니 다.여기 서 지정 한 METHOD 는 이 주석 을 방법 위 에 만 놓 을 수 있 고 TYPE(클래스,인터페이스,매 거 진 클래스),FIELD 인 스 턴 스,PARAMETER 형 삼,CONSTRUCTOR 구조 기 등 도 지정 할 수 있 습 니 다.
@Retention 은 주해 의 수명 주 기 를 정의 하 는 데 사 용 됩 니 다.SOURCE 는 컴 파일 기간 에 버 립 니 다.컴 파일 이 끝 난 후,이 주석 들 은 아무런 의미 가 없다.CLASS 클래스 를 불 러 오 는 동안 버 립 니 다.기본 값 입 니 다.런 타임 은 버 리 지 않 습 니 다.실행 중 반사 로 가 져 올 수 있 습 니 다.
그러면 우 리 는 이 주 해 를 사용 합 니 다.
public class HelloWorld {
@AnnoSample(value = "hello")
public void hello(){
System.out.println("hello,world");
}
}
여기에 주 해 를 만 들 고 사용 하 는 것 이 완료 되 었 습 니 다.그러나 우 리 는 이 주해 가 어떠한 변화 도 가 져 오지 않 았 다 는 것 을 알 수 있다.이 주해 가 있 는 것 과 없 는 것 은 차이 가 크 지 않다.그러면 주해 자 체 는 메타 데이터 로 만 볼 수 있 고 어떠한 업무 논리 도 포함 되 지 않 는 다 는 것 을 알 아야 한다.주 해 는 라벨 과 같 고 성명 과 같 으 며 표면 에 주석 이 달 린 이곳 은 특정한 논 리 를 가지 게 될 것 이다.
주 해 는 이 방법 에 라벨 을 붙 여 우리 로 하여 금 이곳 에 가서 논 리 를 좀 더 해 야 한 다 는 것 을 알 게 했다.그럼 이 라벨 을 어떻게 가 져 오 나 요?
반 사 를 사용 할 수 있다.
구체 적 인 실현 은 다음 과 같다.
public class Main {
public static void main(String[] args) throws Exception {
Class c=Class.forName("HelloWorld");
Method[] methods = c.getMethods();
for (Method method : methods) {
Annotation[] annotations = method.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
if (annotation.annotationType()==AnnoSample.class) {
System.out.println(((AnnoSample)annotation).value());
}
}
}
}
}
위의 코드 는 앞에서 쓴HelloWorld
류 의 Method 배열 을 반사 적 으로 얻 고 옮 겨 다 니 며 모든 방법 에 있 는 모든 주 해 를 옮 겨 다 니 는 것 입 니 다.우리 가 판단 해 야 할 주 해 를 찾 으 면 논리 적 처 리 를 합 니 다.여 기 는 value 를 인쇄 하 는 값 입 니 다.주해 의 기초 지식 을 알 게 된 이상 Spring 의@Autowired 가 어떻게 실현 되 었 는 지 살 펴 보 자.
@Autowired
원본 코드 보기:
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
이 주 해 는 구조 기,실례 방법,형 삼,실례 변수,주해 에 사용 할 수 있 으 며 생명주기 가 실 행 될 때 사용 할 수 있다.이@Documented 는 자바 doc 에 주 해 를 추가 할 지 여 부 를 표시 할 뿐 입 니 다.@Autowired 주해 자체 가 특별한 것 이 아니 라 이 주해 에 관 한 특정한 논리 가 중요 하 다 는 것 을 알 수 있 습 니 다.
논리 가 있 는 클래스 는 원본 코드 에 힌트 가 있 습 니 다.
두 번 연속
if (annotation.annotationType()==AnnoSample.class)
을 사용 하여 전체 검색 을 통 해 이 종 류 를 조회 합 니 다.그 중의
Shift
방법 은 논리 적 인 것 이다.첫 번 째 화살 표 는 현재 class 를 얻 은 다음 두 번 째 화살 표 는
buildAutowiringMetadata()
의 모든 filed 를 판단 하여@Autowired 가 있 는 지 확인 하 는 것 입 니 다.아래targetClass
는 여기 판단 filed 와 유사 합 니 다.@Autowired 판단 을 통과 한 후 다음 과 같이 실행 합 니 다.
currElements.add(new AutowiredFieldElement(field, required));
이 필드 를 용기 에 넣 는 것 입 니 다.@Autowired 의 인 스 턴 스 변수/방법 이 하나 가 아니 기 때문에 모두 찾 아 판단 합 니 다.이 방법의 마지막 에:
이 클래스 와@Autowired 주 해 를 사용 한 인 스 턴 스 집합 을 되 돌려 줍 니 다.돌아 온 것 은 이것 이 었 다.그렇다면 다음 단 계 는 그것 을 주입 하 는 것 이 었 을 것 이다.
주입 의 논 리 는
doWithLocalMethods
방법 에서:이 방법 중 첫 번 째 는 find AutowiringMetadata()방법 을 호출 한 다음 에 이 방법 에서 우리 가 앞에서 분석 한
postProcessProperties()
방법 을 호출 한 것 을 볼 수 있다.즉,우 리 는 클래스 와 그 주해 정 보 를 얻 은 다음 에 아래buildAutowiringMetadata()
방법 으로 주입 하기 시작 했다.필드 에 대해 서 는 반사 류 Field 의 set()방법 으로 값 을 설정 하 는 것 을 볼 수 있 습 니 다.
field.set(target, getResourceToInject(target, requestingBeanName));
방법 에 대해 서 는 invoke 를 사용 하여 구체 적 인 매개 변수 값 을 가 져 와 서 실행 합 니 다.
method.invoke(target, getResourceToInject(target, requestingBeanName));
inject()
방법의 매개 변 수 는 바로 주입 할 bean 의 이름 입 니 다.이 방법의 기능 은 바로 이 bean 의 이름 에 따라 그것 을 가 져 오 는 것 입 니 다.자바 주해 및 Spring 을 이해 하 는@Autowired 가 어떻게 이 루어 졌 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 주해 Spring 의@Autowired 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.