2014-12-20 2 views
6

Say Service는 로깅 측면 (주석)을 적용해야하는 Dao 클래스를 호출합니다. 어떻게 aspect가 실제로 적용되는지 궁금합니다.스프링 요소가 내부적으로 어떻게 작동합니까?

서비스 객체 아래에 DAO 삽입시 스프링은 약간의 애스펙트 (이 경우 로깅)가 DAO 용으로 구성되어 있으므로 실제 대상 객체 대신 프록시 객체를 주입한다는 것을 알게되었습니다. DAO 내부의 메소드를 실제 호출 할 때 프록시는 애스펙트를 적용한 다음 실제 타겟 객체를 호출합니다. 그 맞습니까 ? 또한 나는 이것이 시간 짜기라는 것을 믿습니다.

반면에 aspect를 적용해야하는 클래스에 대해 바이트 코드 조작 이 수행되는로드 시간 짜기 (javaagent 구성 사용)에서도 동일하게 수행 할 수 있습니다. 그래서 프록시는 여기에 사진으로 나오지 않습니다.

이것이 모든 스프링 모듈의 기초이므로 틀렸다고 생각하면 제발 저를 고쳐주십시오.

답변

5

귀하의 이해가 맞습니다. Spring AOP는 프록시 기반이다. Spring은 주어진 타겟 빈에 대한 프록시를 생성하기 위해 JDK 프록시 (프록시 대상이 적어도 하나의 인터페이스를 구현할 때 선호됨) 또는 CGLIB 프록시 (대상 객체가 인터페이스를 구현하지 않는 경우)를 사용한다.

달리 구성하지 않는 한, Spring AOP는 런타임 위 빙을 수행합니다. 그러나 AspectJ를 통해로드 타임 직조를 수행하도록 Spring을 설정할 수있다. 자세한 내용은 documentation link을 확인하십시오. Spring AOP proxying internals

+0

런타임 위빙의 경우 인 aspect 설정에 기반하여 프록시를 주입해야 하는지를 결정하는 데 성능 오버 헤드가 없기 때문에,로드 시간 짜기가 성능면에서 더 우수하다고 생각합니다. 예,로드 시간 길쌈 서버 시작 시간이 조금 더 오래 걸리 겠지만 일회성 활동으로는 괜찮습니다. –

+0

로드 시간 짜기 (또는 특히 컴파일 시간 짜기) 성능이 더 좋을 수 있습니다.로드 테스트를 통해 실제로 확인하는 것이 좋을 것입니다) 하지만 빌드 시스템의 변경 사항처럼 다른 영역을 고려할 수도 있습니다.아티팩트가 생성되기 전에이 단계를 포함해야합니다. –

+1

단지 유용한 인용문입니다. "컴퓨터 과학의 모든 문제는 너무 많은 방향성 문제에 대한 과정을 제외하고 다른 수준의 간접적 인 지시에 의해 해결 될 수 있습니다."- David Wheeler – smwikipedia

1

아직도 여기에 명확하게 두 지점이있다

참조에 대한

실제로 link

로드에서

을 짜는 시간을 실행하지 직조 시간을로드 내 게시물에

먼저 하나 -time weaving (LTW)은 클래스 로더가 클래스 파일을로드하고 클래스를 JVM. 이를 지원하기 위해 런타임 환경에서 명시 적으로 제공되거나 "weaving agent"를 통해 활성화 된 하나 이상의 "weaving 클래스 로더"가 필요합니다.

두 번째는 가장 간단한 방법입니다 직조

컴파일 타임 직조 컴파일 시간입니다. 응용 프로그램에 대한 소스 코드가 있으면 ajc는 소스에서 컴파일하고 출력으로 짠 클래스 파일을 생성합니다. 위버의 호출은 ajc 컴파일 프로세스에 필수적입니다. 측면 자체는 소스 또는 바이너리 형식 일 수 있습니다. 영향을받는 클래스가 컴파일되는 데 필요한면이 있으면 컴파일시에 직조해야합니다. 클래스에 멤버를 추가하고 컴파일되는 다른 클래스가 추가 된 멤버를 참조하는 경우와 같은 측면이 필요합니다.

관련 문제