Доступ к конфигурации Java из нескольких классов
Я искал способы сделать простую, простую, основанную на файлах конфигурацию в Java. Я посмотрел во встроенный Java Properties
и библиотека общей конфигурации Apache. Для последнего, перегнанный код выглядит следующим образом:
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 для меня, но не слишком ли много накладных расходов только для файловой конфигурации? (Сила весны в 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 ответ
Итак, у вас есть пара вариантов. Один простой способ - хранить и получать доступ к объекту конфигурации статически.
Еще одна вещь, которая мне нравится, когда я хочу 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() служит центральным местом для "подключения" вашего приложения, поэтому легко передать ваш объект конфигурации каждому компоненту, который в этом нуждается.