Доступ к конфигурации Java из нескольких классов - PullRequest
0 голосов
/ 08 сентября 2018

Я искал способы сделать простую, простую конфигурацию на основе файлов в Java. Я посмотрел на встроенную в Java Properties и библиотеку Apache Common Configuration. Для последнего, перегнанный код выглядит следующим образом:

Configurations configs = new Configurations();
Configuration config = null;
try
{
    config = configs.properties(new File("config.properties"));
}
catch (ConfigurationException cex)
{
}

long loadQPS = config.getInt("loadQPS");

Проблема, с которой я столкнулся, заключается в том, что я вставляю это в каждый отдельный класс, что является неоптимальным по крайней мере по двум причинам: 1) Я читаю файл один раз для каждого класса, когда я должен прочитать его только один раз. , 2) дублирование кода.

Одним из очевидных решений будет создание класса конфигурации Singleton, к которому я затем получу доступ из любого другого класса. Но, безусловно, это желаемая функция почти во всех случаях использования, поэтому не следует ли включать ее в саму библиотеку конфигурации (я что-то упустил)? Я также подумал об использовании конфигурации Spring, которая может создать класс конфигурации Singleton для меня, но не слишком ли много накладных расходов только для файловой конфигурации? (Сила Spring в DI, насколько я понимаю.)

Что является хорошим решением или лучшей практикой (если есть)?

РЕДАКТИРОВАТЬ : простое статическое решение, предложенное в ответе:

public class ConfigClass {

    static Configuration config;

    static {
        Configurations configs = new Configurations();

        Logger sysLogger = LoggerFactory.getLogger("sysLogger");
        try
        {
            config = configs.properties(new File("config.properties"));
        }
        catch (ConfigurationException cex)
        {
            sysLogger.error("Config file read error");
        }
    }
}

Доступ в пакете по ConfigClass.config.

1 Ответ

0 голосов
/ 08 сентября 2018

Итак, у вас есть пара вариантов. Один простой способ - это статическое хранение и доступ к объекту конфигурации.

Еще одна вещь, которая мне нравится, когда я хочу Dependency Injection без Spring, - это структурирование программы в DI дружественной манере. Вы можете эмулировать DI-контейнер, превратив вашу функцию main () в «конфигурацию» вашей программы, которая в конечном итоге запускает ее.

Рассмотрим типичное многоуровневое веб-приложение: метод main (), дружественный к DI, может выглядеть следующим образом:

public class AddressBookApp {
  public static void main(String[] args) {
    Configuration conf = new Configuration(args[0]);

    // Creates our Repository, this might do some internal JDBC initialization
    AddressBookRepository repo = new AddressBookRepository(conf);

    // Pass the Repository to our Service object so that it can persist data
    AddressBookService service = new AddressBookService(repo);

    // Pass the Service to the web controller so it can invoke business logic
    AddressBookController controller = new AddressBookController(conf, service);

    // Now launch it! 
    new WebApp(new Controller[] { controller }).start();
  }
}

Этот main () служит центральным местом для "подключения" вашего приложения, поэтому легко передать ваш объект конфигурации каждому компоненту, который в этом нуждается.

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