2011-01-21 2 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 весной может быть выбор. Вы можете проанализировать файл и создать объект MetaData в BeanPostProcessor.

+0

Есть десятки MetaData, сгенерированных в классе из модели, явно создавая их, будет загрязнять исходный код. –

+0

P.S. ленивая инициализация должна быть синхронизирована. См. Http://bit.ly/gJdSK2. :) –

Смежные вопросы