자바 주석 및 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");
    }
}
여기에 주 해 를 만 들 고 사용 하 는 것 이 완료 되 었 습 니 다.
그러나 우 리 는 이 주해 가 어떠한 변화 도 가 져 오지 않 았 다 는 것 을 알 수 있다.이 주해 가 있 는 것 과 없 는 것 은 차이 가 크 지 않다.그러면 주해 자 체 는 메타 데이터 로 만 볼 수 있 고 어떠한 업무 논리 도 포함 되 지 않 는 다 는 것 을 알 아야 한다.주 해 는 라벨 과 같 고 성명 과 같 으 며 표면 에 주석 이 달 린 이곳 은 특정한 논 리 를 가지 게 될 것 이다.
주 해 는 이 방법 에 라벨 을 붙 여 우리 로 하여 금 이곳 에 가서 논 리 를 좀 더 해 야 한 다 는 것 을 알 게 했다.그럼 이 라벨 을 어떻게 가 져 오 나 요?
반 사 를 사용 할 수 있다.
  • 반사 체 제 를 이용 하여 클래스 의 대상 을 얻 을 수 있 습 니 다.이 class 대상 을 통 해 그의 모든 방법 을 얻 을 수 있 습 니 다
  •  method,필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드 필드
  • 주 해 를 받 은 후에 우 리 는 이 주해 가 우리 가 실현 하고 자 하 는 주해 인지 아 닌 지 를 판단 할 수 있다.만약 에 주해 논리
  • 를 실현 한다.
    구체 적 인 실현 은 다음 과 같다.
    
    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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기