Свойства загрузчика классов
Мы разработали контейнер приложения, который создает новый загрузчик классов для каждого независимого приложения, работающего в контейнере. Когда вызывается определенное приложение, загрузчик классов контекста потока устанавливается соответствующим образом с загрузчиком классов приложения.
Избегая использования ThreadLocal, возможно ли хранить свойства в загрузчике классов, так что вы сможете получить, в этом случае, специфичные для приложения свойства непосредственно из загрузчика классов.
Например, я хочу иметь возможность каким-то образом сохранить, а затем получить свойства при доступе к контекстному загрузчику классов:
Thread.currentThread().getContextClassLoader()
Это возможно? Или ThreadLocal - единственно возможный вариант?
2 ответа
Вместо того, чтобы приводить загрузчик классов, он может загрузить пользовательский класс свойств, например
public class AppClassloaderProperties
{
static Properties appProperties = loadAppProperties();
static private Properties loadAppProperties() {
// fetch app properties - does not need to be thread-safe, since each invocation
// of this method will be on a different .class instance
}
static public final Properties getApplicationProperties() {
// this method should be thread-safe, returning the immutable properties is simplest
return new Properties(appProperteis);
}
}
Поскольку этот класс загружается как часть загрузчика классов приложения, для каждого приложения предоставляется новый класс. AppClassloaderProperties
Класс для каждого приложения будет отличаться. Каждое приложение может затем получить свои свойства загрузчика классов, вызвав
Properties props = AppClassloaderProperties.getApplicationProperties();
// use the properties
Нет необходимости в локальных потоках или приведении текущего загрузчика классов.
Как насчет создания подкласса загрузчика классов контекста, расширения его нужной вам поддержкой свойств, а затем просто приведения Thread.currentThread(). GetContextClassLoader()?