我对Spring Boot学到的知识总结如下
首先
去年11月到12月,我第一次开始接触SpringBoot,将所学的内容作为备忘录保存下来。
※请注意,这只是备忘录而已。
目标读者
这是给打算接触Spring Boot的人的。对于有使用经验的人来说,这可能是熟悉的内容。
我做的东西
一个简单的外部公开API,根据收到的输入值返回相关信息。
使用过的各种东西 guò de
-
- Java(1.8)
-
- Spring Boot(2.1.0)
-
- Spring Data JPA
-
- Maven(3.5.3)
- Lombok(1.18.2)
这个应用程序的设计构造被实施了。
各种课程的概述
各种不同类别的描述和样例
主类
给予@SpringBootApplication注解。
与以下三个注解同时给予的情况等效。
@EnableAutoConfiguration
Spring Bootの自動設定がオンになり、定義した依存関係に従って自動で各種設定を行ってくれる。@ComponentScan
コンポーネントスキャンが実行され、スキャン対象パッケージ内の@Component
が付与されたクラスが自動で読み込まれてDIコンテナで管理される。コンポーネントスキャンしたクラス同士は@Autowired
により変数にセットすることが出来る。※後述のサンプルコード参照@Configuration
付与することで、個別にBeanを登録したり、設定クラスを読み込むことが出来る。通过@ComponentScan和@EnableAutoConfiguration,会对各种类进行加载和设置,从而使应用程序运行。
注意:默认情况下,被标记为@ComponentScan的类以及位于同一级和更低级包中的类会被扫描。因此,被标记为@ComponentScan的类所在的上级包中的类不会被加载。
@SpringBootApplication
public class SampleApplication {
public static void main (final String[] args) {
SpringApplication.run (SampleApplication .class, args);
}
@Override
protected SpringApplicationBuilder configure (final SpringApplicationBuilder builder) {
return builder.sources (SampleApplication .class);
}
}
@RestController 类
@RestControllerアノテーションを付与する。@ComponentScanの対象。
APIのインターフェース部分を実装するクラス。入力値の精査や各種コンポーネントの呼び出しを行い、クライアントにレスポンスを返す。
各メソッドにHTTPメソッドやURLのマッピングを定義し、リクエストと呼び出されるメソッドのマッピングを行う。
受け取ったリクエストや返すレスポンスを扱うためにどのFormクラスを使うかは各メソッドごとに定義する。
/**
* サンプルコントローラ。
*/
@RestController
@Validated
public class SampleController {
@Autowired
private SampleService service; //使用するServiceクラスを紐づける。
@PostMapping (path = "/sample", //メソッドにマッピングするパスを指定する。
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, //受け取るリクエストのMediaTypeを指定する。
produces = MediaType.APPLICATION_JSON_UTF8_VALUE) //返すレスポンスのMediaTypeを指定する。
@CrossOrigin
public ResponseEntity<SampleForm> sampleMethod (
@RequestHeader (value = "sample_key") //ヘッダーから受け取る値のキー値を定義する。
@NotEmpty (message = "sample_key is empty.") //Formを使用せずに精査する場合はここに精査内容を定義する。
@Valid String sampleKey, //ヘッダーから受け取った値を格納する変数を定義する。
@RequestBody
@Valid SampleForm form //ボディから受け取った値を格納するFormクラスと格納先の変数を定義する。
) {
return new ResponseEntity<> (service.sampleMethod (form.getSampleUserId), HttpStatus.OK);
}
}
Form类
-
- クライアントからのリクエストの内容や返すレスポンスの情報を保持するクラス。
-
- 精査内容等はここに記述する。
- アノテーションによる精査定義のほか、独自の精査用メソッドを定義することも出来る。
@Data
@ToString
public class SampleForm implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty ("sample_user_id") //JSON上でのキー値を定義する。
@NotEmpty (message = "sampleUserId is empty") //精査内容を定義する。
private String sampleUserId;
}
@RestControllerAdvice类
@RestControllerAdviceを付与する。@ComponentScanの対象。
RestControllerクラスに共通の処理を実装出来る。(事前処理やエラーハンドリング等)
@ExceptionHandlerを付与したメソッドを用意することで、指定した例外が送出された際に自動でエラーハンドリングしてくれる。
@RestControllerAdvice
public class SampleExceptionHandler {
@ExceptionHandler (Exception.class) //キャッチする例外を定義する。
@ResponseStatus (HttpStatus.INTERNAL_SERVER_ERROR) //上記例外発生時に返すレスポンスのHTTPステータスコードを定義する。
protected ErrorForm handleInternalServerError (Exception e) {
logger.error (e);
return new ErrorForm ("Internal Server Error");
}
@RequiredArgsConstructor
private class ErrorForm implements Serializable {
private static final long serialVersionUID = 1L;
private final String message;
}
}
服务类
@Serviceを付与する。@ComponentScanの対象。
業務ロジックを実装するクラス。RestControllerクラスから受けとった入力値をもとに、各種計算やDBアクセスを行う。
今回はSpring Data JPAを使ったのでリポジトリクラスを呼び出すことでDBアクセスを行う。
@Service
@Transactional //例外発生時に自動ロールバックする。
public class SampleService {
@Autowired
private SampleUserRepository sampleUserRepository; //使用するRepositoryクラスを紐づける。
public SampleForm returnSampleForm (String sampleUserId) {
return convertToSampleForm(sampleUserRepository.findBySampleUserId(sampleUserId));
}
}
存储库类
@Repositoryを付与する。@ComponentScanの対象。
DBアクセスを行うクラスで、Spring Data JPAを使うとinterfaceだけ実装すれば簡単なCRUDなら実行することが出来る。
JpaRepositoryを継承させ、アクセスするテーブルを定義する。
命名規約に従ってメソッド名を付けることで、自動的にCRUDのどれなのか、どんな検索条件かを読み取ってくれる。
例)findByUserId(String userId) とすると、userIdで検索を行うメソッドとなる。
クエリを実装したりテーブル結合を伴う検索をしようとするとここまで単純にはいかないが、今回は使用しなかったため割愛。
@Repository
public interface SampleUserRepository extends JpaRepository<SampleUser, String> { //アクセス先のテーブルと主キーの型を定義する。
SampleUser findBySampleUserId (String sampleUserId); //命名規約に従ってメソッド名と引数を定義する。
}
实体类
@Entityを付与する。
DBから取得したデータやDBに投入するデータを保持する。
今回はテーブルと1対1に紐づかせた。
@Entity
@Table (name = "sample_user") //紐づけるテーブル名を定義する。
@Data
public class SampleUser implements Serializable {
private static final long serialVersionUID = 1L;
/** サンプルユーザID */
@Id //主キーの項目に付与する。
@GeneratedValue (strategy = GenerationType.IDENTITY) //自動採番させる場合は採番方法を定義する。
private String sampleUserId;
/** サンプルユーザ名*/
private String sampleUserName;
}
请参考以下网站
- https://docs.spring.io/spring-boot/docs/current/reference/html/index.html