10

.NET に携わっていたので、NancyFX や Web API などのマイクロ Web フレームワークが IoC コンテナーに対して持っているサポートに精通しています。

Sinatra のような Ruby の同様のフレームワーク (NancyFX は Sinatra に基づいています) では、依存性注入の機能があるようです。

私が見たところ、Java spark アプリケーションはメイン メソッドとして実行されるため、依存関係や IoC コンテナーを渡すことはできないようです。

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}

これをサポートせずに、このようなフレームワークがどのように役立つかを理解するのに苦労しています。

このフレームワークがそうでない場合、これをサポートする別の軽量フレームワーク (Spring は私が覚えているものからは軽量ではありませんが、変更された可能性があります) はありますか?

4

5 に答える 5

5

Java Spark で Guice を使用するのは非常に簡単です。SparkFilter基本的に、Guice インジェクターを作成するには、次の方法でを拡張する必要があります。

public class SparkGuiceFilter extends SparkFilter {

    private Injector injector = null;

    @Override
    protected SparkApplication[] getApplications(final FilterConfig filterConfig) throws ServletException {
        final SparkApplication[] applications = super.getApplications(filterConfig);

        if (this.injector == null) {
            this.injector = Guice.createInjector(new MainModule());
        }

        if (applications != null && applications.length != 0) {
            for (SparkApplication application : applications) {
                this.injector.injectMembers(application);
            }
        }

        return applications;
    }
}

次に、 Jetty またはその他のサーブレット コンテナーを使用しweb.xmlて、Spark アプリケーションを通常のアプリケーションとして実行する必要があります。war

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <filter>
        <filter-name>SparkGuiceFilter</filter-name>
        <filter-class>com.devng.spark.guice.SparkGuiceFilter</filter-class>
        <init-param>
            <param-name>applicationClass</param-name>
            <param-value>com.devng.spark.SparkApp</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SparkGuiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

ただし、このアプローチにはいくつかの制限があります。Guice でリクエスト ベースまたはセッション スコープを使用することはできません。これが必要ない場合は、問題ありません。それ以外の場合は、公式の Guice ドキュメントで説明されているように、Guice サーブレット拡張機能を統合GuiceFilterしてを追加する必要があります。また、とで同じインジェクター インスタンスを使用していることを確認する必要があります。web.xmlGuiceFilterSparkGuiceFilterGuiceServletContextListenerweb.xml

ここの私の GitHub で完全に機能する例を見つけることができますhttps://github.com/devng/demo/tree/master/sparkjava-guice

于 2017-04-25T11:21:36.277 に答える
3

私は実際に Spark と Guice を試していますが、私が見る限り、少なくとも今日 (2017 年 8 月) の時点では、両方を使用した依存性注入の使用は非常に簡単です。

あなたがしなければならないのは、次のことだけです。

public class MySparkApplication {

    public static void main(String[] args) {

        Injector injector = Guice.createInjector();
        SomeClass someClass = injector.getInstance(SomeClass.class);

        get("/hello", (req, res) -> someClass.getSomeString());
    }
}

それは実際にはそれと同じくらい簡単なようです。Guice Getting Startedガイドに従ったところ、うまくいきました。Spark を実行http://localhost:4567してブラウザで開くと、メソッドから返された文字列が表示されます。

于 2017-08-12T10:04:38.177 に答える