Spring勉強メモ
Spring は Spring applicatin contextとして参照されるコンテナを提供する
Springのコア
Spring applicatin context: application conponent を生成・管理する。
それらのapplication conponent もしくははbeanがSpring application context内で配線される。
このコアコンテナの上にSpringと関連ライブラリのフルポートフォリオが提供するもの
- Web framework
- data永続化
- セキュリティ
- 他システムとの統合
- ランタイムモニタリング
- リアクティブプログラミングモデル
等
歴史的にはSprigin application contextはxmlファイルで管理されていた。
最近: アノテーションベースが一般的になっている。
@Configuration
Spring application contextにbeanを供給
@Bean
それが返すオブジェクトはbeanとしてapplication contextに加えられるべき
@Component
,@Controller
,@Service
etc...はつけられてたクラスそれ自体をSpring application contextにcomponentとして登録するが@Bean
はその関数が変え返すオブジェクトをBeanとして登録する。
アノテーションベースのメリット
- Type Safety
- リファクタリング容易性
Spring の技術
auto wiring
自動であるコンポーネントが依存する他のbeanを注入する。
component scan
クラスパスからコンポーネントを探し、application contextにbeanとしてそれらを生成する。
Spring Boot
component scan + autowiringを越えた自動設定機能をもつ。
auto configuration
クラスパスや環境変数などのエントリに基づいて、どのコンポーネントを設定して配線する必要があるかを合理的に推測する。
pomってなんや。。?
Mavenの設定ファイルということしか分からん。。。
<parent>
エレメント
spring-boot-starter-parent
Springプロジェクトでよく使われる依存関係を管理する。
@SpringBootAplication
これはSpring Bootのアプリケーションですよー
@SpringBootConfiguration
@Configuration
の特別な形式
このクラスを設定クラスとして指定する
@EnableAutoConfiguration
Spring Boot自動設定を有効にする。
@ComponentScan
コンポーネントスキャンを有効にする。
@Component
,@Controller
,@Service
etc...をつけているクラスをSpring application contextにcomponentとして登録する。
run()
メソッド
Spring application contextを生成する。
test
なんもやってないように見えるが、Spring application caontextのロードが成功してたかチェックしちえる。
@SpringBootTest
JUnitにSpring Bootの機能付きでテストするよと伝えている。
@ExtendWith(SpringExtension.class)
Spring MVC
Controller
リクエストをハンドルしてレスポンスを返すもの。 Routerのことだよね?
@Component
とつけることでcomponent scanでこの関数をapplication contextに入れてくれている
テスト
@MebMvcTest
Spring MVC applicationのコンテクストで走らせる
ControllerがSpring MVCに登録される
Tomcat Webサーバーはアプリケーションの一部である。
DevToolsの機能
- コード変更時のアプリケーション自動再起動
- リソース変更時のブラウザの自動更新
- テンプレートキャッシュの自動無効化
などなど・・
コード変更時のアプリケーション自動再起動
よく変更されるやつとあんまり変更されないやつ別々のクラスローダーにロードされる
依存するライブラリはあんまり変更されない方。したがって依存関係を変更するとアプリケーションのハードリスタートが必要になる
Lombok
Lombokの@Data
アノテーションを使うと色々なメソッドとコンストラクタをコンパイル時に生成してくれる。
Slf4j
Simpole Logging Facade for Java
Lombokの@Slf4j
アノテーションは
明示的に
private static final org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(ClassName.class);
とクラス内で宣言したのと同じ効果をもつ。
Servlet
特定のタイプのネットワークリクエストに応答するクラス。サーブレットはサーブレットコンテナの中で走る。
Servlet Container
ネットワークサイドを扱う e.g. HTTP Requestのパース、コネクションハンドリング
有名なサーブレットコンテナ → Tomcat
formのaction属性を省略すると宛先が文書と同じURLになる
Converter
リクエストパラメータの型変換を行うために実装が必要
FormとObjectのbinding
thymeleafではth:object
とth:filed
を使う
Validation from imput
愚直なやりかた
handler内でif
文の洪水を書く。
Springのやりかた
validationをad hocにやるんじゃなくてclassに引き寄せる
アノテーションでどんなバリデーションをするか書いていく。
@ModelAttribute
リレーショナルデータベースをJavaで扱うときの最もよくある選択肢
- JDBC
- JPA
コンストラクタが1つのときは@Autowired
は省略できる。
JDBC template
定石(なのかは分からんが。。)
-
findAl()
findById()
などを定義したインターフェイスを定義する。 - そのインターフェイスを実装したレポジトリを定義する。
- auto wiringでそのリポジトリを使うところに注入する
jdbcTemplate.query(クエリ文字列、結果をオブジェクトに変換する関数の参照 or RowMapperのインスタンス);
jdbcTemplate.update(クエリ文字列);
クエリ実行
クラスパスにファイルを置く
DDLがschema.sql DMLがdata.sql?
Spring Data JDBC
Spring Dataを使うと自動でレポジトリを作ってくれる?
Repository
やCrudRepository
CrudRepostory
saveやfindById、findAllなどのデフォルト実装を提供
永続化のためのアノテーション
@Table
Option。デフォルトではdomainクラスの名前をベースにテーブルの名前がつけられる。
例 TacOrder → Taco_Order
@Table{"Taco_Cloud_Order")
見たく書くことで任意の名前をつけられる。
@Id
idを指定
Application startup
アプリケーションスタートアップ時にロジックを走らせるためのインターフェイス
CommandLineRunner
とApplicationRunner
どちらも関数インターフェイスでrun
メソッドをもっていて、CommandLineRunner
またはApplicationRunner
を実装したBeanはapplication contextとビーンが繋げられたあとに各自のrun
メソッドが呼ばれる
違いは引数。CommandLineRunner
はString varargs 。ApplicationRunner
は`ApplicationArguments'というコマンドラインをパースして引数としてアクセスできるメソッドを持っている型。
Spring Data JPA
@CrudRepository
を実装したときにメソッド名から実装を推論する。
@Query
をつけて明示的に動作をしていできる。
Spring Data JDBCでも@Query
は使えるが、
- すべてのカスタムクエリは
@Query
が必要 -
@Query
に書くのはJPA queriesではなく、SQL query
@RestContoroller
目的
- ComponentScanで見つけてもらうため
- 返り値がビューをレンダリングするためではなく直接レスポンスのボディに書き込まれるということ表すため
@RestController
を付与する代わりに@Controller
を使うと書くハンドラに@ResponseBody
をつけなくてはならないかResposeEntity
オブジェクトを返さなくてはならない。
@CrossOrigin
異なったホストからユーザーインターフェイスが提供される場合、APIの使用が妨げられる。これを解消するためにはCORSを使う必要がある。@CrossOrigin
はCORSの利用を簡単にする。
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
}
Collection<? extends GrantedAuthority>
はGrantedAuthorityを継承している任意のクラスのコレクションと言う意味?
Spring Security
セキュリティ
ログイン、ログアウト、ユーザー登録
SecurityFilterChain
をBeanとして登録する、
リクエストのauthorizeする
ログインページの設定
Springの基本設計
インターフェイスに対してプログラミングする。
環境に対して実装があって、実装とインターフェイスをSpring DIがつないでいる
application.properyは@Component
とanotateされたクラスとつながっている?
@ConditionalOnProperty
プロパティにある記述がされているときに有効になるという意味
TODO Spring 6とSpring Boot 3.0の前バージョンとの変更点を把握する