#java #spring #wicket #circular-dependency
#java #spring #wicket #циклическая зависимость
Вопрос:
В моих приложениях на основе wicket spring у меня есть этот метод для внедрения spring manager в WebApplication
класс:
private void initManager() {
ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.manager = (MyManager) applicationContext.getBean("manager");
}
Обычно я настраиваю внутреннюю страницу ошибок внутри init
метода моего WebApplication
класса. Иногда я также монтирую некоторые страницы с закладками:
public class MyApplication extends WebApplication {
@Override
protected void init() {
IApplicationSettings applicationSettings = getApplicationSettings();
applicationSettings.setInternalErrorPage(ErrorPage.class);
mountBookmarkablePage("privacy", PrivacyPage.class);
}
//............
}
Мои WebPage
классы обычно зависят от моего класса manager, например:
public class ErrorPage extends WebPage {
public ErrorPage() {
MyApplication application = (MyApplication) getApplication();
add(new EmailLink(application.getManager().getMailSupport()));
}
}
Итак, мой WebApplication
класс ссылается на одну или несколько страниц, а мои страницы ссылаются на WebApplication
класс. Является ли это циклической зависимостью? Если да, как я могу этого избежать?
Ответ №1:
Я бы сказал, что это не циклическая зависимость, а конфигурация.
Тем не менее, я думаю, вы всегда можете внедрить свой компонент manager в класс web page также с помощью автозапуска.
Редактировать:
Вам также может потребоваться включить аннотации spring в applicationContext.xml а также добавьте некоторые новые зависимости, если их еще нет в classpath
смотрите applicationContext.xml образец по этому адресу и ваш будут в значительной степени похожи, за исключением имени пакета сканирования. Соответствующим образом обновите эти значения.
public class ErrorPage extends WebPage {
@Autowired
private MyManager myManager;
//setter getter methods as well
}
Комментарии:
1. Используйте @SpringBean в wicket-spring вместо @Autowired.
2. @fmucar: 1 за ваши усилия, спасибо. К сожалению, я все еще использую spring 2.5, и ваш связанный пример не очень подходит, но я понял, что вы предложили. Решение состоит в том, чтобы внедрить моего менеджера на мою базовую страницу, мне просто нужно подумать о моем любимом способе сделать это.
3. @martin-g: Вы правы, мне нравится ваше решение @SpringBean. Если вы хотите, вы можете добавить свое решение в качестве нового ответа.
4. Это не введено в spring3, оно также существует в версии v2.5, но, как предполагает martin-g, если для этого в wicket есть специальная аннотация, лучше использовать именно ее.