blog

Spring5の新機能

Spring5フレームワークのコードはjava8をベースにしており、java9と互換性があります。 Spring5には汎用のロギングパッケージが付属しています。 Spring5は削除されました。log...

Jun 30, 2020 · 7 min. read
シェア

Spring5フレームワークのコードはjava8に基づいており、java9と互換性がありますが、多くのクラスやメソッドが推奨されていない削除されました。

I. ロギング

Spring5には一般的なロギングラッパーが付属しています。

  • Spring5はLog4jConfigListerを削除しました。デフォルトではlog4j2の使用を推奨しています。 最初のステップ 依存関係のインポート
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-api</artifactId>
 <version>2.12.1</version>
 </dependency>
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-core</artifactId>
 <version>2.12.1</version>
 </dependency>
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-slf4j-impl</artifactId>
 <version>2.12.1</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 <version>1.7.30</version>
 </dependency>

ステップ2 設定ファイル log4j2.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--ログレベルと優先順位:OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL-->
<!--Configurationlog4j2独自の内部情報の出力を設定するために使用されるステータスを待って、設定することはできません、プログラムのトレースを設定するときは、さまざまな詳細のlog4j2の内部出力を見ることができる-->
<configuration status="INFO">
 <!--最初にすべてのアペンダーを定義する-->
 <appenders>
 <!--コンソールに情報を出力する-->
 <console name="Console" target="SYSTEM_OUT">
 <!--コンソール出力メッセージのフォーマット-->
 <PatternLayout patten="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
 </console>
 </appenders>
<!--次に、ロガーを定義する。ロガーが定義されて初めて、アペンダーが有効になる。-->
<!--rootプロジェクトのルートログを指定するために使用される。別のロガーが指定されていない場合、ルートがデフォルトのログ出力として使用される。-->
 <logger>
 <root level="info">
 <appender-ref ref="Console"/>
 </root>
 </logger>
</configuration>

@Nullable アノテーション

メソッド、プロパティ、パラメータに使用できます。

  • このメソッドは、戻り値がNULLである可能性があることを示します。
  • 属性onは、属性がNULLである可能性があることを示します。
  • パラメータは、パラメータに示されているように空にすることができます。

III.関数型プログラミングのサポート

public void spring5(){
 //オブジェクトの作成
 GenericApplicationContext context = new GenericApplicationContext();
 //登録のための呼び出しコンテキスト
 context.refresh();//最初にリフレッシュする
 context.registerBean("user1",User.class,()->new User());
 //スプリングでオブジェクトを取得する
// User user = context.getBean("com.bin.spring5.jdbc.domain.User", User.class);//BeanName を指定する場合は、フルパスを使用する必要がある。
 User user = context.getBean("user1", User.class);//ビーン名を使用する
 }

ユニットテスト

junit4との統合

スプリングテストパッケージの紹介

 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-test</artifactId>
 <version>${spring.version}</version>
 </dependency>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.12</version>
 <scope>test</scope>
 </dependency>

コーディング

import com.bin.spring5.jdbc.dao.UserDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)//単体テストフレームワークのバージョンを指定する
@ContextConfiguration("classpath:jdbc.xml")
public class Junit4 {
 @Autowired
 private UserDao dao;
 @Test
 public void test(){
 dao.delete("1");
 }

junit4および統合

依存関係のインポート

 <dependency>
 <groupId>org.junit.jupiter</groupId>
 <artifactId>junit-jupiter-api</artifactId>
 <version>5.6.2</version>
 <scope>test</scope>
 </dependency>

コーディング


import com.bin.spring5.jdbc.dao.UserDao;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
//@RunWith(SpringJUnit4ClassRunner.class)//単体テストフレームワークのバージョンを指定する
//@ContextConfiguration("classpath:jdbc.xml")
@SpringJUnitConfig(locations = "classpath:jdbc.xml")//適合アノテーション 上記2つのアノテーションを置き換える
public class Junit4 {
 @Autowired
 private UserDao dao;
 @Test
 public void test(){
 dao.delete("1");
 }
}

V. SpringWebFlux

Spring5は、Web開発のための新しいモジュールを追加しました 、より一般的なレスポンシブプログラミングを使用してSpringMVC、WebFulxに似た機能 。

このようなサーブレットコンテナに基づいてSpringMVCなどの伝統的なWebフレームワークは、 WebFluxは、非同期ノンブロッキングフレームワークです、サポート後のServlet3.1の非同期ノンブロッキングフレームワークは、コアは、関連するAPIの実装のリアクターに基づいています。

同期と非同期:発呼側にとって、発呼側がリクエストを送り、相手の応答を待つ場合は同期、待たずに他のことをする場合は非同期。

ブロッキングとノンブロッキング: 着信側にとって、リクエストを受け取り、リクエストされたタスクを実行してからフィードバックをする着信側作者はブロッキングであり、リクエストを受け取り、すぐにフィードバックをし、それから物事を実行する着信側作者はノンブロッキングです。

特徴

  • ノンブロッキング:限られたリソースでシステムのスループットとスケーラビリティを向上
  • 関数型プログラミング:WebFluxで関数を実装するためのjava8関数型プログラミングのアプローチ

上記SpringMvcとWebFluxの違い

レスポンシブ・プログラミング

レスポンシブ・プログラミングは、データ・フローと変更伝搬を指向するプログラミング・パラダイムです。つまり、静的または動的なデータストリームをプログラミング言語で簡単に表現することができ、関連する計算モデルは、データストリームを通じて変更された値を自動的に伝播します。

Java8と期間限定リリース

  • ObserverとObservableの2つのクラスがObserverパターンを提供します。
public class ObserverDemo extends Observable {
 public static void main(String[] args) {
 ObserverDemo observerDemo = new ObserverDemo();
 //オブザーバーを追加する
 observerDemo.addObserver((o,arg)->{
 System.out.println("変更が発生する");
 });
 observerDemo.addObserver((o,arg)->{
 System.out.println("222の変更");
 });
 observerDemo.setChanged();//データの変更
 observerDemo.notifyObservers();//通知
 }
}
  • レスポンシブ・プログラミングにおけるリアクターは、リアクティブ仕様のフレームワークを満たすためのものです。
  • ReactorにはMonoとFluxという2つのコアクラスがあり、これらはpublisherというインターフェースを実装し、豊富な演算子を提供しています。 fluxオブジェクトはN個の要素を返すpublisherを実装し、Monoは0個か1個の要素を返すpublisherを実装しています。
  • FluxもMonoもデータストリームのパブリッシャーです。 FluxとMonoの両方を使って発信できるデータシグナルには、エレメント値、エラーシグナル、完了シグナルの3種類があります。エラーシグナルと完了シグナルは、どちらもデータストリームの終了を加入者に伝えるための終了シグナルです。
		<dependency>
			<groupId>io.projectreactor</groupId>
			<artifactId>reactor-core</artifactId>
			<version>3.1.5.RELEASE</version>
		</dependency>
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class TestReactor {
 public static void main(String[] args) {
 //justメソッド宣言
 Flux.just(1,2,3,4);
 Mono.just(1);
 //その他のメソッド
 Integer[] arr = {1,2,3,4};
 Flux.fromArray(arr);
 List<Integer> list = Arrays.asList(arr);
 Flux.fromIterable(list);
 Stream<Integer> stream = list.stream();
 Flux.fromStream(stream);
 }
}

3つの信号の特徴

  • エラー信号と完了信号はどちらも終端信号であり、共存できません。
  • 要素の値を使用せず、エラーと完了のシグナルだけを送信する場合は、空のデータストリームであることを意味します。
  • エラー信号と完了信号がない場合は、ワイヤレス・データ・ストリームであることを意味します。

justやその他のメソッドを呼び出すことは、データフローを宣言するだけで、データフローは発行されません。

Flux.just(1,2,3,4).subscribe(System.out::println);

演算子: データのストリームに対する単一の操作が演算子になります。

  • map 新しい要素にマップされた要素

  • フラットマップ要素をストリームにマッピング

WebFulx の実行フローとコア API

注釈ベースのプログラミングモデル

Read next

call、apply、bindの実装シミュレーション

callメソッド、applyメソッド、bindメソッドは、このポインティングの関数やメソッドを変更するために使用され、これらのメソッドの実装では次のように、そしてところで、それらの違いは、それ\n呼び出しメソッドの実装\n関数が呼び出しメソッドを呼び出すときに、渡される最初のパラメータは、このようなポイントを示します。

Jun 30, 2020 · 3 min read