Веб-приложение Wicket / циклическая зависимость веб-страницы с использованием spring

#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 есть специальная аннотация, лучше использовать именно ее.