Java Spring 5新機能機能Webフレームワーク
例を挙げてください
サンプルアプリケーションからの抜粋から始めましょう。以下は、人オブジェクトを公開する応答情報ライブラリです。伝統的で反応しない情報ライブラリに非常によく似ていますが、Flux <person>と伝統的な返品リスト<person>を返し、Mono <person>が人を返す場所を返します。 Mono <void>は完了フラグとして使用されます。保存が完了した時期を示します。
パブリックインターフェイスPersonRepository {Mono <Person> getPerson(int id); flux <person> allpeople(); mono <void> saveperson(mono <purnes> person);}新しい機能Webフレームワークを使用してライブラリを公開する方法は次のとおりです。
RouterFunction <? .and(route(get( "/person")、request-> {flux <serson> people = repository.allpeople(); return response.ok()。body(frompublisher(people、person.class))。 respons.ok()。build(repository.saveperson(person));}));ここでは、Reactor Nettyで実行する方法を紹介します。
httphandler httphandler = routerfunctions.tohttphandler(route); Reactorhttphandleradapter adapter = new Reactorhttphandleradapter(httphandler); httpserver server = httpserver.create( "、"、httpserver.create( "、"、serverhost "、server.tartandawait
最後にすることは、それを試してみることです:
$ curl 'http:// localhost:8080/person/1' {"name": "John Doe"、 "age":42}以下にさらに紹介があります。深く掘り下げましょう!
コアコンポーネント
コアコンポーネントを徹底的に説明することにより、フレームワークを紹介します:HandlerFunction、RouterFunction、およびFilterFunction。これらの3つのインターフェイスと、記事に記載されている他のすべてのタイプは、org.springframework.web.Reactive.Functionパッケージにあります。
ハンドラー機能
この新しいフレームワークの出発点は、基本的に関数<リクエスト、応答<t >>であるHandlerFunction <T>であり、リクエストと応答が新しく定義されており、不変のインターフェイスは基礎となるHTTPメッセージにJDK-8 DSLを提供するのに優しいです。これは、応答エンティティを構築するための便利なビルドツールであり、応答性で見られるものと非常によく似ています。 HandlerFunction Annotationに対応することは、@RequestMappingの方法です。
「Hello World」処理関数の簡単な例を次に示し、200の状態と文字列のボディを含む応答メッセージを返します。
HandlerFunction <String> helloworld = request-> response.ok()。body(fromobject( "hello world"));
上記の例で見たように、ハンドリング関数は、反応器ベースに基づいて構築することで完全に応答します。それらは、流動性、モノ、またはその他の対応するストリームパブリッシャーを応答タイプとして受け入れます。
注意すべきことの1つは、ハンドラー機能自体に、それをパラメーターとして扱う代わりに応答を返すため副作用がないことです(Servlet.Service(ServletRequest、servletResponseを参照)。副作用には多くの利点があります。テスト、書き込み、最適化が簡単です。
ルーター機能
着信要求は、routerFunction <t>(つまり、関数<リクエスト、オプション<ハンドラーファンション<t >>)を使用してハンドラー関数にルーティングされ、一致する場合はハンドラーにルーティングされます。それ以外の場合、空の結果が返されます。ルーティング方法は、@RequestMapping Annotationと同様に機能します。ただし、別の重要な違いがあります。注釈を使用する場合、ルートは注釈付き値が表現できる範囲に制限され、これらのメソッドのオーバーレイに対処することは困難です。ルーティング方法を使用する場合、コードはそこにあり、簡単に上書きまたは交換できます。
以下は、埋め込み処理機能を備えたルーティング関数の例です。少し長く見えますが、心配しないでください。それを短くする方法を見つけます。
routerfunction <string> helloworldroute = request-> {if(request.path()。equals( "/hello -world"))){return optional.of(r-> response.ok()。 } else {return optional.empty(); }};一般的に、完全なルーティング方法を記述する必要はありませんが、代わりにRouterFunctions.Route()を静的に導入するため、Request Judgement Fumula(RequestPredicate)(つまり、Predicate <question>)およびHandlerFunction)を使用してルーティングメソッドを作成できます。判断が成功した場合、処理方法が返されます。そうしないと、空の結果が返されます。以下は、ルート方法を使用して上記の例です。
routerfunction <string> helloworldroute = routerfunctions.route(request-> request.path()。equals( "/helloworld")、request-> respons.ok()。
(静的に)requestPredicatesをインポートできます。*パス、HTTPメソッド、コンテンツタイプなどに基づいて、一般的に使用される述語にアクセスするには、HelloWorldrouteをより簡単にすることができます。
routerfunction <string> helloworldroute = routerfunctions.route(requestpredicates.path( "/hello -world")、request-> respons.ok()。
併用関数
2つのルーティング関数が新しいルーティング関数を形成できます。どちらの処理関数へのルーティングです。最初の関数が一致しない場合、2番目の関数が実行されます。 RouterFunction.and()を呼び出すことにより、このような2つのルーティング関数を組み合わせることができます。
RouterFunction <?
パスが /helloWorldに一致する場合、上記は「Hello World」に応答し、 /the-annwer Matchが同時に「42」を返します。どちらも一致しない場合、空のオプションが返されます。結合されたルーティング関数は順番に実行されるため、特定の関数の前に汎用関数を配置することは理にかなっていることに注意してください。
また、呼び出しおよびまたはまたはまたは。これは次のように機能します。そして、2つの指定された述語が一致する場合、結果は一致し、2つの一致のうちの1つ、または一致する場合。例えば:
RouterFunction <? Response.ok()。body(fromObject( "42"))));
実際、RequestPredicatesで見つかったほとんどの述語は組み合わされています!たとえば、RequestPredicates.get(String)は、RequestPredicates.Method(httpmethod)およびRequestPredicates.Path(String)の構成です。したがって、上記のコードを次のように書き換えることができます。
routerfunction <?
メソッド参照
ちなみに、これまでのところ、すべての処理関数をインラインラムダ式として書きました。これはデモと短い例でうまく機能しますが、2つの懸念を混ぜたいので、「混乱」を引き起こす傾向があると言わなければなりません。だから、それが物事をより簡単にすることができるかどうかを見たいです。最初に、処理コードを含むクラスを作成します。
class demohandler {public response <string> helloworld(request request){return respons.ok()。body(fromobject( "hello world")); }/ * http://www.manongjc.com/article/1590.html */public Response <string> theanswer(request request){return respons.ok()。body(fromobject( "42")); }}両方の方法には、処理機能と互換性のあるフラグがあることに注意してください。これにより、メソッド参照を使用できます。
Demohandler Handler = new Demohandler(); // dirouterfunction <?
FilterFunction
ルーティング関数によってマッピングされたパスは、routerFunction.filter(filterFunction <t、r>)を呼び出すことでフィルタリングできます。関数のハンドラーパラメーターは、チェーン全体の次のアイテムを表します。これは典型的なハンドラー機能ですが、複数のフィルターが接続されている場合、別のフィルター機能にもなります。ルートにログフィルターを追加しましょう。
// http://www.manongjc.comrouterfunction <?応答<?> next.handle(request);
次のハンドラーを呼び出すかどうかはオプションであることに注意する必要があります。これは、セキュリティスキームやキャッシュスキーム(ユーザーが十分なアクセス許可を持っている場合にのみ次へと呼び出すなど)で非常に役立ちます。
ルートは無限のルーティング関数であるため、次のハンドラーがどのような種類の応答情報を返すかがわかります。これが、フィルターで応答<?>になって、オブジェクトでボディに応答する理由です。ハンドラークラスでは、両方のメソッドが応答<string>を返しているため、文字列応答本体を持つことができるはずです。 ()の代わりにrouterfunction.andsame()を使用してこれを行うことができます。この組み合わせ方法では、パラメータールーティング関数が同じタイプであることが必要です。たとえば、すべての応答を大文字にすることができます。
routerfunction <string> route = route(get( "/hello-world")、handler :: helloworld)。 Response.from(Response).body(fromobjed(newbody));
注釈を使用して、@controlleradviceおよび/またはservletfilterを使用して同様の関数を実装できます。
サーバーを実行します
これはすべて問題ありませんが、私が忘れたことの1つ:実際のHTTPサーバーでこれらの機能を実行するにはどうすればよいですか?答えは間違いなく別の関数を呼び出すことによってです。 routerfunctions.tohttphandler()を使用して、ルーティング関数をhttphandlerに変換できます。 Httphandlerは、Spring 5.0 M1に導入された応答抽象化です。これにより、Reactor Netty、RxNetty、Servlet 3.1+、およびUnderTowのさまざまな応答ランタイムで実行できます。この例では、Reactor Nettyでルートを実行するようなものであることを示しました。 Tomcatの場合、それは次のように見えます:
httphandler httphandler = routerfunctions.tohttphandler(route); httpservlet servlet = new servlethttphandleradapter(httphandler); tomcat server = new tomcat(); context rootcontext = server.addcontext( "、"、 System.getProperty( "Java.io.tmpdir")); tomcat.addservlet(rootContext、 "servlet"、servlet); rootContext.AddServletMapping( "/"、 "servlet"); tomcatserver.start();
注意すべきことの1つは、上記のコードがスプリングアプリケーションのコンテキストに依存しないことです。 JDBCtemplateやその他のSpringユーティリティクラスと同様に、アプリケーションのコンテキストを使用することはオプションです。コンテキストでハンドラーとルーティング機能を接続できますが、必須ではありません。
また、Dispatcherhandlerで実行できるようにルーティング関数をハンドライングに変換することもできます(レスポンシブ@Controllersが必要になる場合があります)。
結論は
簡単な要約を通して結論を描きましょう。
より包括的な理解を得るために、機能的なWebフレームワークを使用して簡単な例プロジェクトを作成しました。アドレスをダウンロードしてください
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!