Связанные: https://www.javacodegeeks.com/2013/03/javafx-2-with-spring.html и Как обрабатывать несколько файлов и сообщений для интернационализации в Spring?
У меня есть приложение, которое смешивает пружинуи JavaFX вместе, следуя методу, указанному в первой ссылке.
В начале у меня был всего один файл il8n для всего, однако со временем все растет, и теперь пришло время разделить этот файл.Все приложение уже разделено на модуль.Последнее, что нужно сделать, - это разбить этот глобальный файл.
В настоящее время все просто: я использую статический класс, содержащий ссылку на правильный пакет:
private static ApplicationContext SPRING_CONTEXT;
private static ObjectProperty<ResourceBundle> resourceBundleWrapper;
public JavaFxLoader(ApplicationContext context,
ObjectProperty<ResourceBundle> resourceBundle){
SPRING_CONTEXT = context;
resourceBundleWrapper = resourceBundle;
}
Проблема начинается, когдаЯ хочу иметь, возможно, разные файлы для разных модулей.
Предположим:
- Каждый компонент независим и не зависит напрямую от двух разных комплектов.
- Компонент может иметь два дочерних компонента, каждый из которых указывает на отдельный файл.
- Я использую FXML, поэтому не могу напрямую передать свой объект управления в MessageSource, однако он может получитьВнедрен в Контроллер.
Так что в основном весь мой конкретный элемент управления выглядит следующим образом:
public class MyCustomControl extends Control {
private static final java.net.URL FXML_PATH = JavaFxLoader.makeFXMLPath(MyCustomControl .class,
"my-custom-control.fxml");
...
public MyCustomControl () {
}
@Override
protected Skin<?> createDefaultSkin() {
return new DefaultSkin();
}
private class DefaultSkin extends VBox implements Skin<MyCustomControl> {
public DefaultSkin(MyCustomControl control) {
MyCustomControlController controller = JavaFxLoader.loadFXML(this,
MyCustomControlController .class, FXML_PATH);
//post-intialisation of controller by giving the reference to the control
controller.initData(control);
}
@Override
public MyCustomControl getSkinnable() {
return control;
}
@Override
public Node getNode() {
return this;
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
}
}
Обратите внимание, что иногда мне нужно самому создать объект Control, поэтому я буду создавать его непосредственновместо того, чтобы FXMLLoader делал это для меня.
Проблема с моим текущим кодом заключается в методе loadFXML:
public static <T> T loadFXML(Object owner, Class<T> controllerClass, URL fxmlPath){
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setResources(resourceBundleWrapper.get());
fxmlLoader.setController(SPRING_CONTEXT.getBean(controllerClass));
fxmlLoader.setLocation(fxmlPath);
fxmlLoader.setRoot(owner);
try {
fxmlLoader.load();
return fxmlLoader.<T>getController();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
В настоящее время существуетя не могу указать конкретный пакет.
Итак, мой вопрос: какой будет правильный способ сделать это?
- Настройте карту пакета и пакета ресурсов и выполнитенекоторая волшебная отражательная способность, основанная на имени контроллера пакета, чтобы угадать, какой пакет я должен использовать.Я бы предпочел этого избегать.
- Статически хранить каждый экземпляр ресурса пакета в классе для каждого модуля и добавлять новый параметр в функцию loadFXML: экземпляр MessageSource.У меня уже есть статическая ссылка на общую утилиту JavaFXLoader, я не уверен, стоит ли добавлять другие необработанные статические ссылки.
- Найдите способ получить все необходимые пакеты и собрать их все в один пакет для всех.Ради этого мы будем предполагать, что каждый ключ уникален для всех MessageSource / RessourceBundle.
Я бы предпочел последний способ сделать это, однако для этого мне потребуется:
- В каждом модуле определите строку, указывающую на его связки
- В классе конфигурации основного модуля всего приложения найдите способ собрать все эти строки вместе и создать один MessageSource для всех.
Конфигурация загружена:
- С нетерпением, нет отложенной загрузки компонентов (некоторые внутренние компоненты имеют отложенную загрузку своих данных)
- Использование аннотацийтолько.Даже в Контроллере меня не волнует связь между пружиной и моим контроллером.Однако я не вставляю springContext в myController, зависимость заключается только в аннотации @ Autowired / @ Qualifier.
- Нет Spring-Boot, только Spring-Context.