私はWaffleフレームワークで自分自身で開発したアプリケーションを、DIメカニズムとしてStruts2をフレームワークとして使用する新しい "スタック"にDIメカニズムとして変換することを任されましたDIメカニズムとしてGuiceと一緒に。誰もそこに誰も最小限の痛みでこれを行うと同時に、新しいフレームワークとDIメカニズムの両方を最大限に活用するための有用なポインターがありますか?Waffle/PicoからStruts2/Guiceへの変換
事前に感謝します。
私はWaffleフレームワークで自分自身で開発したアプリケーションを、DIメカニズムとしてStruts2をフレームワークとして使用する新しい "スタック"にDIメカニズムとして変換することを任されましたDIメカニズムとしてGuiceと一緒に。誰もそこに誰も最小限の痛みでこれを行うと同時に、新しいフレームワークとDIメカニズムの両方を最大限に活用するための有用なポインターがありますか?Waffle/PicoからStruts2/Guiceへの変換
事前に感謝します。
私は少し曖昧だったのですが、最後にやりました。 DI用のWaffle/Picoメカニズムは、レジストラと呼ばれるクラスを使用して、注入するクラスとそのWebApp内のスコープを設定します。自分のサイト上の例は次のとおりです。
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);
}
}
スコープもこれらのモジュールで構成されています。シングルトンは、効果的にアプリケーションスコープのクラスであり、次のように指定することができますので、移行はかなり簡単です
bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);
しかし、GuiceのもSessionScoped.class
とRequestScoped.class
を持っています。 Struts2の、依存性注入について
は、最終的にはGuiceのになったものの初期のバージョンが実際にあった使用ので、
<constant name="struts.objectFactory" value="guice" />
とでStrutsPrepareAndExecuteFilterの指定をstruts.xmlするために、この行を追加することの問題となり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>
これは、同様のセットアップの問題が発生した人には十分なはずです。