Преобразование из вафли / пико в Struts2 / Guice - PullRequest
2 голосов
/ 11 августа 2009

Мне было поручено преобразовать приложение, которое было разработано мной в Waffle Framework с использованием PicoContainer в качестве механизма DI, в наш новый «стек», который должен использовать Struts2 в качестве среды с Guice в качестве механизма DI. Есть ли у кого-нибудь полезные советы о том, как сделать это с минимальными затратами и в то же время получить максимум от новой инфраструктуры и механизма DI?

Большое спасибо заранее.

1 Ответ

3 голосов
/ 28 августа 2009

Правильно, я понимаю, что вопрос был немного расплывчатым, но я все же сделал это в конце. Механизм 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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...