Как мне написать привязки, которые бы вытягивали соответствующие зависимости из "божественных" объектов RequestState и RequestData?
Здесь вы можете довольно легко начать использовать Guice для внедрения зависимостей, в зависимости от того, как загружается ваше приложение. Допустим, у вас есть Книжный модуль.
public class BooksModule extends AbstractModule {
protected void configure() {
// Do Nothing
}
@Provides @RequestScoped
BookData provideBookData(RequestState requestState) {
return (BookData) requestState.getData();
}
@Provides @RequestScoped
OfferRepository provideOfferRepository(BookData bookData) {
return bookData.getOfferRepository();
}
}
Теперь вы можете использовать Guice для внедрения зависимостей в ваш класс BookPriceAdjuster.
@RequestScoped
public class BookPriceAdjuster {
private final Book book;
private final OfferRepository offerRepository;
@Injected
public BookPriceAdjuster(Book book, OfferRepository offerRepository) {
this.book = book;
this.offerRepository = offerRepository;
}
// whatever methods it has
}
И теперь вы можете использовать провайдера для вашего BookPriceAdjuster внутри вашего сервлета.
public class AdjustBookPriceHandler extends BookRequestHandler {
private final Provider<BookPriceAdjuster> bookPriceAdjusterProvider;
@Injected
public AdjustBookPriceHandler(Provider<BookPriceAdjuster> bookPriceAdjusterProvider) {
this.bookPriceAdjusterProvider = bookPriceAdjusterProvider;
}
@Override
public void handleRequest(RequestState requestState, RequestData requestData, Object obj) {
Book book = (Book) obj;
long newPrice = Long.parseLong(requestData.getQueryParam("price");
BookPriceAdjuster priceAdjuster = bookPriceAdjusterProvider.get();
priceAdjuster.adjustPrice(newPrice);
}
}
Чтобы загрузить приложение, вам нужно установить BooksModule с помощью инжектора Guice. Как вы поступите с этим, зависит от того, как ваше приложение загружается в данный момент. Для сервлетов я настоятельно рекомендую изучить расширение Guice-Servlet , которое позволяет вам определять ваши сервлеты и зависимости в «типобезопасной идиоматической Java» вместо файла web.xml. Красиво просто.
Или на этом этапе использование фреймворка было бы таким же сложным и грязным?
Как вы можете видеть выше, вы можете постепенно начать внедрять привязки (и поставщиков) непосредственно в существующее веб-приложение, не меняя интерфейсы или шаблоны вызовов с легкостью. Все, что осталось, это бустраппинг ... Просто прокрасться туда, и пусть он медленно вступит во владение:)