Конвертация из Waffle/Pico в Struts2/Guice
Мне было поручено преобразовать приложение, которое было разработано мной в Waffle Framework, используя PicoContainer в качестве механизма DI, в наш новый "стек", который должен использовать Struts2 в качестве среды с Guice в качестве механизма DI. Есть ли у кого-нибудь полезные советы о том, как сделать это с минимальной болью и в то же время получить максимум от новой инфраструктуры и механизма DI?
Спасибо заранее.
1 ответ
Правильно, я понимаю, что вопрос был немного расплывчатым, но я все же сделал это в конце. Механизм Waffle/Pico для DI использует класс, называемый регистратором, для установки классов, которые вы хотите внедрить, и их области действия в веб-приложении. Пример на их сайте:
public class MyRegistrar extends AbstractRegistrar {
public MyRegistrar(Registrar delegate) {
super(delegate);
}
public void application() {
register("helloworld", HelloWorldController.class);
}
}
В этом примере показан класс области приложения - для областей сеанса и запроса вы просто помещаете их в соответствующий session()
или же request()
методы.
В Struts2 и Guice все устроено немного иначе. Принимая Guice сначала, он вводит зависимости, используя @Inject
аннотация над конструктором. Конфигурация внедрения выполняется через классы, называемые модулями, которые должны переопределять метод, называемый configure()
чтобы связать интерфейсы с их классами - пример Google приведен ниже.
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(TransactionLog.class).to(DatabaseTransactionLog.class);
bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);
bind(BillingService.class).to(RealBillingService.class);
}
}
Scoping также настроен в этих модулях. По сути, Singleton является классом области приложения и может быть задан следующим образом:
bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);
Но Guice также имеет SessionScoped.class
а также RequestScoped.class
поэтому переход довольно тривиальный.
Что касается Struts2, то использованная инъекция зависимостей фактически была ранней версией того, что в итоге стало Guice, поэтому встает вопрос о добавлении этой строки в struts.xml.
<constant name="struts.objectFactory" value="guice" />
И указав StrutsPrepareAndExecuteFilter в файле web.xml.
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/* </url-pattern>
</filter-mapping>
Этого должно быть достаточно, чтобы запустить кого-либо с подобной проблемой установки.