файлы конфигурации для веб-приложения - загрузить один раз и сохранить где? - PullRequest
8 голосов
/ 01 июля 2010

У меня есть куча свойств (конфигураций), которые могут меняться в зависимости от среды. Однако эти значения не меняются после развертывания веб-приложения. Итак, учтите, что существует файл application.properties, который я хочу прочитать много раз во время обычной работы программы.

Я знаю, что, возможно, смогу загрузить их во время запуска сервера. Однако каков наилучший способ доступа к ним из простых Java-классов в бэкэнде? Эти бизнес-классы не имеют ничего общего с сервлетами и т. Д. И не зависят от веб-приложения.

Итак, сегодня я загружаю свойства через ServletContext. Тогда что? Где я должен хранить их, чтобы они были легко доступны для других объектов без необходимости повторного выполнения fileInputStream.load?

Спасибо.

Ответы [ 4 ]

13 голосов
/ 01 июля 2010

Реализация ServletContextListener.

Вот базовый пример:

public class Config implements ServletContextListener {
    private static final String ATTRIBUTE_NAME = "config";
    private Properties config = new Properties();

    @Override
    public void contextInitialized(ServletContextEvent event) {
        try {
            config.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));
        } catch (IOException e) {
            throw new SomeRuntimeException("Loading config failed", e);
        }
        event.getServletContext().setAttribute(ATTRIBUTE_NAME, this);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // NOOP.
    }

    public static Config getInstance(ServletContext context) {
        return (Config) context.getAttribute(ATTRIBUTE_NAME);
    }

    public String getProperty(String key) {
        return config.getProperty(key);
    }
}

который вы регистрируете следующим образом в web.xml:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

и к которым вы можете получить доступ в своих сервлетах следующим образом:

Config config = Config.getInstance(getServletContext());
String property = config.getProperty("somekey");

Подумав, эти свойства на 100% специфичны для бизнес-уровня, а не для самого веб-приложения? Тогда ServletContextListener действительно неуклюж и слишком тесно связан. Просто предоставьте бизнес-уровню свой собственный класс Config, который загружает свойства из пути к классам и кэширует его в некоторой переменной static (возможно, Map<String, Properties>?).

1 голос
/ 01 июля 2010

Поместите ваши классы / свойства конфигурации в файл jar и поместите этот файл jar в WEB-INF / lib.Затем вы можете получить к ним доступ через обычные средства доступа к классам, куда вам нужно в вашем веб-приложении.

1 голос
/ 01 июля 2010

У вас должна быть статическая ссылка на эти свойства и доступ к ним таким образом.Вы в конечном итоге прочитаете их в памяти и сохраните там.Таким образом, вам не придется обращаться к диску столько раз во время выполнения.

Итак, предположим, у вас есть класс AppProperties:

public class AppProperties {
  private static Properties props;

  protected static loadProperties(File propsFile) {
    ... read from disk, and set props static member ...
  }

  public static getProperties() {
    return props;
  }
}

Из вашего сервлета инициализаторавызовет loadProperties для чтения свойств с диска.Затем в коде приложения для доступа к свойствам:

String myProp = AppProperties.getProperties().getProperty("myProp");
0 голосов
/ 01 июля 2010

Вы можете использовать JNDI, если ваш сервер приложений поддерживает это.

Смотрите мой вопрос (и ответ) здесь: Конфигурация уровня развертывания Spring

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...