2011-01-21 4 views
1

대용량의 XML 파일에서 생성되는 정적 클래스 필드에 일부 데이터를 주입하려고합니다. 사용자 정의 클래스 초기화를위한 경량급 클래스 로더?

class Foo { 
    ... 
    static MetaData xxx; 
    static MetaData yyy; 
} 

사출

는 메타 데이터 인스턴스를 구축이 Foo.properties 및 XXX, YYY 특성 분석 발견은 매우 간단하다.

IoC 컨테이너가이 작업에 도움이 될지 모르지만 그렇지 않은 것 같습니다.

Foo는 IoC 컨테이너에 의해로드되지 않는 클래스에 의해 사용될 수 있기 때문에.

내 생각에, 리플렉션을 기반으로 특정 클래스 초기화 코드를 추가하기 위해 컨텍스트 클래스 로더를 수정하십시오.

아이디어가 있으십니까?

EDIT 많은 IoC 컨테이너가 있는데, 아마도 초기화 확장을 지원할 수도 있습니다.

+1

'Foo는 IoC 컨테이너에 의해로드되지 않는 클래스에 의해 사용될 수 있기 때문에 .' 이것은 아마도 문제가 아니지만 IoC는 일반적으로 몇 가지 구성/주석을 필요로하며 이것이 가능할 수 있습니다. ClassLoader를 수정하지 않고도 모든 클래스 또는 속성 파일을 찾고 Class.forName을 호출하고 반사를 수행하면 안됩니까? 사실, 가능한 경우 Map >를 작성하여 모든 것을 피하는 것이 좋습니다. – maaartinus

+0

아니요, Class.forName()을 제거하면 디자인 용도입니다. 맵은 없으며, 구문 분석/생성 프로세스는 매우 빠르며 MetaData는 메모리 풋 프린트를 줄이기위한 약한 참조입니다. –

+0

왜 xxx, yyy가 지연 모드로 초기화 될 수 없습니까? –

답변

0

xxx, yyy는 지연 모드으로 초기화됩니다.

같은 :

private static MetaData xxx=null; 
public static MetaData getXXX(){ 
    if(xxx=null){ 
     xxx=parse("Foo.properties"); 
    } 
    return xxx; 
} 

그리고 IOC의이 선택이 될 수 있습니다 봄 프로그램, BeanPostProcessors에해야됩니다. BeanPostProcessor에서 파일을 파싱하고 MetaData 객체를 생성 할 수 있습니다.

+0

모델의 클래스에서 수십 개의 메타 데이터가 생성되어 명시 적으로 생성 된 메타 데이터가 소스 코드를 오염시킵니다. –

+0

P. 지연 초기화는 동기화되어야합니다. http://bit.ly/gJdSK2를 참조하십시오. :) –