Spring超入門
-Springと出会ってから1年半-
mi presento
■名前:内立良介(うちたてりょうすけ)
■あだ名:ジェンダ・フリ男
男性と女性の狭間(性格的な意味で)
■趣味:ファッション・パン屋巡り
靴に夢中・クロワッサン
■特技:バスケ
初めてから15年くらい?
■所属:Tagbangers
通称タグバン
Tagbangers
■場所:横浜市神奈川区
最寄りは横浜駅(徒歩15分)
■社則
業務時間・交通費・通勤費・給与の4つのみ
■飲み会
社長いじり
■勉強会:TAG BAR
初回からちょうど1年
AGENDA
1. 今回作ったWebアプリケーションの紹介
2. Springについて
3. ソースコードの解説
4. おまけ
1.今回作ったWebアプ
リケーションの紹介
利用者管理アプリ
• 新規登録機能
• 編集機能
• 一覧表示機能
• 削除機能
新規登録機能の
構成図
え?
ビジネスロジックって
よく聞くけど何だ?
訳すと、業務の論理?
ビジネスロジックは、データベースとユーザ
ーインタフェース間の情報のやりとりを制御
する手順といったようなものを指す(技術的
でない)用語である。(Wikipediaより)
一言で言うと
システム固有の
お仕事部分
具体例
• 画面から商品単価入力すると、税込でDBに登録す
る処理
• 電話番号が「1234567」ではなく「123-4567」の
フォーマットで入力されているかのチェックする処
理
よし、スッキリ!次
2.Springについて
Springって何?
• Javaのフレームワーク
• DI(依存性の注入)はとても重要
• さまざまなプロジェクト
え?(本日2回目)
DI(Dependency Injection):依存性の注入
意味わからん
DI
• DIとは、Springが管理しているインスタンスの
Beanをちょうだいとお願いしてDIコンテナから該
当箇所に注入してもらうこと
DIコンテナ
(Beanを管理している箱)
Bean
Bean Bean
Bean UserCreateController.java
Beanちょうだい
Bean
Bean:豆
え?
豆ってどういうこと?
調べて見ると、
コーヒー豆からきてるっぽ
い
Java(ジャワ)
• ジャワコーヒーはインドネシアのジャ
ワ島を産地とするコーヒー豆。(
WikiPediaより)
Beanも日本語訳は無
視
アドバイス
日本語訳に
とらわれ過ぎない
さらにもう1つ
アノテーション=注釈
って訳さない方がよい
コメントとの違い何?
ってなりました
経験談はこれくらいで
次
Spring Bootとは?
Spring Boot-1-
• Spring Frameworkでアプリケーションを簡単に作
るための仕組み
• 2014年4月にver1.0がリリースで1.4.2が最新
• XMLやJavaConfigでのBean定義、ログの設定など
が不要
Spring Boot-2-
• mavenに限って言えば、pom.xmlに書くだけで依存
関係を解決してくれる
• 良くも悪くもどういう動きをしているかよく知らな
くてもそれなりに堅牢なアプリは作れる
どれくらい簡単かと
言うと
Spring Initializrでぽちぽちすれば、
基本設定で構築されたプロジェク
トを作ることができる
Spring Initialize?
Spring Initializr
https://start.spring.io/
Spring Bootの
重要な仕組み
AutoConfigure
• Springが提供しているプロジェクトやOSSを利用す
る時に必要なBean定義をSpring Bootが自動で行っ
てくれる仕組みのこと
面倒なセットアップや設定がほとんど不要になる
pom.xmlに書いたものを
Bean登録する処理など
自動設定を有効にするには?
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
このクラスに@Configurationを付与する
でも、、、
@Configurationないじゃん!
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
に含まれている
はず。でも、、、
@Configurationないじゃん!
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @Filter(type =
FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public @interface SpringBootApplication {
あやしい
見つけた!
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@SpringBootApplicationは3
つのアノテーションを
1つにまとめたもの
@SpringBootApplication
• @EnableAutoConfiguration
• 自動設定を有効にする
• @ComponentScan
• このパッケージ配下で@Component、
@Service、@Controller、@RestController、
@Namedが付与されているクラスをDIコンテ
ナに登録する
• @SpringBootConfiguration
• このクラス自体をBean定義可能にする
自動設定が有効に
なるまでの流れ
1.DIコンテナ(ApplicationContext)作成
2.BeanFactory作成
3.spring.factories読込、
BeanDefinition取捨選択、並び替え
4.Bean登録
3.ソースコードの解説
pom.xml
•プロジェクトに関する情報が書かれている
•使いたいstarterやOSSの情報をかくとをレポジトリ
から取ってくる
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
...
</dependencies>
@Controller
•Controllerだよって教える
•これを書くとSpring Bootで自動設定の対象となって
Bean登録される
@RequestMapping
•create.htmlのactionで指定したパスに一致している
パスにマッピングされる
•Spring Boot 1.4からは@GetMappingや
@PostMapping、@DeleteMappingなども登場して
いる
@GetMapping = @RequestMapping(method =
RequestMethod.GET)
@Validated
•formの入力値チェックをしてもらいたいときにつけ
る
@PostMapping
public String save(
@Validated @ModelAttribute(name =
FORM_MODEL_KEY) UserCreateForm form,
BindingResult errors,
RedirectAttributes redirectAttributes) {
formの中にformがある
ときのエラーチェック
UserCreateForm.java
@Getter
@Setter
public class UserCreateForm implements Serializable {
@NotNull
private String name;
private Integer age;
@NotNull
private Gender gender;
@Valid
private AddressForm address;
public UserCreateRequest toUserCreateRequest() {
return new UserCreateRequest(getName(), getAge(), getGender(),
Address.generateAddress(getAddress()));
}
}
@ValidをつけるとFormのなかの
Formの入力値チェックをする
Springに思う事
神ってる
おわり

Spring超入門-Springと出会ってから1年半-

Editor's Notes

  • #3 ちなみにTagbangersご存知のかた?
  • #5 こんな感じで話します。その他、Springを学ぶときに立ちはだかった壁を紹介します。
  • #7 基本的なCRUDアプリケーションを実装することが多いかな?というのと、わかりやすさのためにこのようなアプリケーションにしました。 今回は、新規登録機能に絞ってお話しします。実際に実行してみます!
  • #9 新規登録機能の構成図について説明します。 このアプリケーションは、MVCパターンで実装しています。 MVCは、Model、View、Controllerの略でModelがビジネスロジック、ViewがUI、ControllerがModelとViewの制御の役割をもっています。 ここでは、UserCreateFormがModel、create.htmlとsearch.htmlがView、UserCreateControllerがControllerをあらわしています。 create.htmlで入力して保存ボタンを押すと、name属性と同じ名前のFormのフィールドに値が格納されUserCreateControllerに処理が移ります。 UserCreateControllerからUserServiceに処理が移りDBに保存し、再度Controllerに処理が移り、search.htmlにリダイレクトしています。 詳しくは後ほど説明します。
  • #15 一言で言うと、、、、
  • #19 Springのコア機能となっているDIとAOPはとても重要です。 さまざまなプロジェクトがあり、どのような時に使うか3つだけざっくり紹介します。 まず、Spring Frameworkは、Webアプリケーションの開発する時に使う。 次に、Spring Dataは、データベースにアクセスする時に使う。 最後に、Spring Securityは、ログイン画面作りたい時とかあるページを見る権限持ってるかチェックする時に使う。 他にもプロジェクトがあるのでぜひ調べてみてください。
  • #36 よく耳にするSpring Bootとは何でしょうか?
  • #37 バージョン1.4からSpring 4.3をベースに作られています。 Javaでアプリケーションを作るのは面倒っていうイメージが覆るほど簡単に始められます。
  • #42 Spring Initializrから始めると手取り早くアプリケーションを作れます。 ビルドツール・Spring Bootのバージョン等を選んでプロジェクト名などを入力し、 「Generate Project」を押下します。 すると、入力した項目が設定された状態のプロジェクトのzipファイルが落ちてきます。 これをIDEにインポートするだけです。
  • #44 AutoConfigureは、Spring Bootにおける超目玉の仕組みです。 これは、Spring Bootが行う自動設定の仕組みであり、Bootの特徴の1つと言えるので重要だと思いました。
  • #45 Spring Initializrを利用してプロジェクトを作るとこのようなクラスが作成されます。 runメソッドの第1引数に@Configurationが付与されたconfigurationクラスを渡します。 これは、DIコンテナを生成する際に使用するクラスです。
  • #50 これは、@SpringBootApplicationのインターフェースです。ここにも@Configurationないじゃん!
  • #51 これは、@SpringBootConfigurationのインターフェースです。やっと見つけました!つまり、どこかに内包されていればOKです。
  • #52 先ほども述べましたように
  • #53 ちなみにこの@SpringBootApplicationは、アプリケーションのエントリポイントのクラスに付与します。
  • #55 冒頭に説明したBeanを管理するためのものです。
  • #56 Bean定義ファイルを読込、Beanを生成するためのものです。
  • #57 spring.factoriesに書けば、自動設定の対象となる。
  • #58 これが、Spring Bootで自動設定が有効になるまでのおおまかな流れです。後ほど、起動するとどれくらい数のBeanが登録されるのか見て見ましょう
  • #59 これまでの説明を踏まえてソースコードを見て見ましょう。このプロジェクトもSpring Initializrを利用して作成したものです。
  • #65 UseCreateFormは、中にさらにAddressFormを持っています。 Formの中のFormのフィールドの入力値チェックをしたってときにつけるアノテーションが@Validです。