2008-10-23 6 views
20

나는 몇 시간 동안 스프링을 사용하고,하지만 난 항상 더 구체적으로, 그들은로드 만 인터페이스 또는 표시 콩/클래스를 짜 어떻게 작동 않는 방법 궁금 @ 주석.스프링 프레임 워크의 내부 구조 및 기타 IOC의 컨테이너

xml 선언의 경우 봄이 내 콩을 미리 처리하는 방법을 쉽게 볼 수 있습니다 (스프링이 읽는 xml 컨텍스트에서 선언 됨).하지만 주석이있는 클래스의 경우 작동 방식을 볼 수 없습니다. jvm에 에이전트를 전달하지 않습니다.

나는 기준의 일종으로 사전 처리 클래스를 허용 일부 Java/JVM 후크가 생각하지만, 나는이 문서에 아무것도 발견 할 수 없었다.

은 누군가가 나 일부 문서에 포인트? 이것은 java.lang.instrument.ClassFileTransformer API와 관련이 있습니까?

답변

28

기본적으로 스프링은 바이트 코드 후속 처리 을 XML 용으로 사용하지 않으며 주석 구성 용 beans도 수행하지 않습니다. 대신 관련 콩 (예를 들어 java.lang.reflect.Proxy 자바 SDK에서 참조) 동적 프록시로 포장된다. 동적 프록시를 사용하는 실제 객체를 감싸고 AOP 조언을 적용 할 수 있도록 메서드 호출을 차단. 차이점은 프락시가 본질적으로 프레임 워크에 의해 생성 된 새로운 인공 클래스 인 반면, 위빙/바이트 코드 후 처리는 기존의 인위적인 클래스를 변경한다는 점입니다. 후자는 언급 한 Instrumentation API를 사용하지 않으면 불가능합니다.

주석의 경우, <context:component-scan> 태그의 구현은 스프링 주석이있는 모든 클래스의 클래스 경로를 스캔하고 스프링 주석 메타 데이터 자리 표시자를 만듭니다. 그런 다음 XML을 통해 구성된 것처럼 처리됩니다 (또는보다 구체적으로 둘 다 동일하게 처리됩니다).

스프링은 바이트 코드 후 처리 자체를하지 않지만 프록시가 만족스럽지 않으면 Spring과 잘 작동하는 AspectJ 직조 에이전트를 구성 할 수 있습니다.

+0

감사합니다. 훌륭한 답변입니다! 나는 스프링이나 다른 프레임 워크가 컨테이너에 컨테이너를 제공하지 않고도 클래스에 액세스 할 수있는 방법에 다소 당혹 스러웠다.하지만 지금은 의미가있다. :) –

+0

프록시의 사용은 Spring을 사용하기위한 인터페이스를 코딩해야한다는 것을 지적해야한다. (프록시는 인터페이스에서만 작동 함) –

+1

아니요. JDK 프록시는 인터페이스에서만 작동하며, CgLib 프록시는 일반 클래스에서도 작동합니다. –

1

The Spring Framework download은 소스 코드와 함께 번들로 제공되므로 코드 (자국어로 src 폴더)를 자유롭게 찾아 볼 수 있습니다.

The reference manual 또한 꽤 오래 걸립니다 (다운로드 할 경우 588 페이지, as a PDF).

+3

감사합니다. 그러나 스프링 소스로 뛰어 들지 않는 방법을 찾고있었습니다 ... 어쨌든 PDF는 봄의 내부를 언급하지 않습니다. –

+0

나는 이것이 왜 downvoted인지 이해하지 않는다! –