Конвертация из 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>

Этого должно быть достаточно, чтобы запустить кого-либо с подобной проблемой установки.

Другие вопросы по тегам