Spring初学メモ
雑多なメモ
コンポーネント・スキャンの対象にするためのアノテーション
アノテーション | 説明 |
---|---|
@Controller | Web MVC フレームワークである、Spring MVCのコントローラであることを示すアノテーション。 Spring4からはREST Webサービス用に、@RestControllerも追加された。 |
@Service | サービスクラスであることを示すアノテーション。 @Componentと機能的な違いはない。 |
@Repository | リポジトリクラスであることを示すアノテーション。 このアノテーションを付けたクラス内で発生した例外は、特例のルールにしたがって、Springが提供するDataAccessExceptionに変換される。 |
Entity(JPA Entity)とは
データベースにおける表の個別の行に対応するオブジェクト。
PAではPOJO(Plain Old Java Object、ごく普通のJavaオブジェクト)にアノテーションを加えるだけで作成できる。
【参考】https://teachingprogramming.net/archives/145
Lombokで @Data
をつけると、getter/setterだけでなくToStringも一緒に付与してくれる。
よって関連テーブルがある場合に、ToStringが呼ばれると循環参照が発生する場合がある。
解決策
参照しないようにフィールドの出力を除く
@ToString(exclude = "customers")
JpaRepository と CrudRepository の違い
A. ページングもソートもしたい場合はJpaRepositoryを使えばいい
@Data
についてもっと知りたい
lombokの公式より引用
@Data is a convenient shortcut annotation that bundles the features of @ToString, @EqualsAndHashCode, @Getter / @Setter and @RequiredArgsConstructor together
つまり@Getter/@Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructorを、アノテーションをつけるだけでよしなに作ってくれるもの…らしい。
「認可用のロール作成には、AuthorityUtilsを使うと便利」…これはなんで?
まずはAuthorityUtilsのコードを見る。
// Failed to get sources. Instead, stub sources have been generated by the disassembler.
// Implementation of methods is unavailable.
package org.springframework.security.core.authority;
public final class AuthorityUtils {
public static final java.util.List<org.springframework.security.core.GrantedAuthority> NO_AUTHORITIES;
private AuthorityUtils() {
}
public static java.util.List<org.springframework.security.core.GrantedAuthority> commaSeparatedStringToAuthorityList(java.lang.String authorityString) {
return null;
}
public static java.util.Set<java.lang.String> authorityListToSet(java.util.Collection<? extends org.springframework.security.core.GrantedAuthority> userAuthorities) {
return null;
}
public static java.util.List<org.springframework.security.core.GrantedAuthority> createAuthorityList(java.lang.String... authorities) {
return null;
}
static {} {
}
}
何やらリストを作ってるようだけど、これはspring securityについてもっと知らないと読めない。
ということでspring securityも調べる。
→ 仕組みは以下からなんとなく理解した。
【参考】http://terasolunaorg.github.io/guideline/current/ja/Security/Authorization.html
spring security内にあるGrantedAuthorityが、疑問の肝のような気がしてきたのでこれを調べた。
GrantedAuthority オブジェクトは AuthenticationManager によって Authentication オブジェクトに挿入され、あとで AccessDecisionManager によって認可の決定を行うときに読み取られます。
https://spring.pleiades.io/spring-security/site/docs/5.2.8.RELEASE/reference/html/authorization.html#authz-authorities
うーん。。。わかるようなわからないような。。
多分自分の中で言語化ができてない
Think of a GrantedAuthority as being a "permission" or a "right". Those "permissions" are (normally) expressed as strings (with the getAuthority() method). Those strings let you identify the permissions and let your voters decide if they grant access to something.
You can grant different GrantedAuthoritys (permissions) to users by putting them into the security context. You normally do that by implementing your own UserDetailsService that returns a UserDetails implementation that returns the needed GrantedAuthorities.
GrantedAuthority = 認可をするためのメソッド(?)
一旦これでclose.
もし不足・不備があれば都度修正する。
Beanって何だ?
@Beanと書いたメソッドでインスタンス化されたクラスがシングルトンクラスとしてDIコンテナに登録される。任意のクラスで@Autowiredで注入してアクセスできる。
シングルトン、DIコンテナ、アクセスのように単語でしか頭に入ってなかったが、文章化された…感謝。
コンポーネント・スキャンって何だ?
コンポーネントスキャンとは
Bean定義用のアノテーションが付与されたクラスをDIコンテナに登録すること。
Bean定義用のアノテーションとは、@Component, @Controller, @Serviceといったアノテーションのこと
コンポーネントスキャンでは、Bean定義用のアノテーションが付与されたクラスを、
文字通り「スキャン」して探し、該当する各クラスをBeanとしてDIコンテナ管理下に置く処理を行います。
アノテーションをつけると、スキャンして付与されたクラスを探す。該当したクラスをBeanとしてDIコンテナ管理下に置く…ってことかな???
Springでは、DIコンテナに登録するコンポーネントのことを「Bean」、Configurationのことを「Bean定義」という。
spring securityのconfigureの中を細かく見る
// 1. ログインフォーム以外には認証なしでアクセス不可
// 2. ログインフォームの表示パス, login, success時の遷移先、失敗時の遷移先を設定
// 3. パラメーター名を設定
// 4. ログアウトの設定
http.
authorizeRequests().antMatchers("/loginForm").permitAll().anyRequest().authenticated().and().formLogin()
.loginProcessingUrl("/login").loginPage("/loginForm").failureUrl("/loginForm?error")
.defaultSuccessUrl("/customers", true).usernameParameter("username").passwordParameter("password").and()
.logout()
.logoutSuccessUrl("/loginForm");
パスワードのハッシュ化
PasswordEncoderの実装を選ぶことで、ハッシュ化アルゴリズムを決める。以下はパスワードのハッシュ化において推奨されているPbkdf2アルゴリズムを実装。
@Bean
PasswordEncoder passwordEncoder() {
return new Pbkdf2PasswordEncoder();
}
HikariCP
コネクションリークとは何か?
pool から connection を borrow しっぱなしで pool に返却しないこと。
これを行なってしまうと、pool内のコネクションが枯渇してエラーが発生する。
spring
- spring boot :複雑な手順や設定なしにspringプロジェクトを作成できる
- spring framework: webアプリのコアな機能を提供する
- spring data: O/Rマッピングの自動化などデータベース操作を簡略化する
- spring security: ログイン認証やCSRF対策など
POJO
普通のJavaオブジェクト
昔はある手続きをするのに何かのクラスを継承するなど複雑な手続きが必要だった。そうではないクラスのことを示す。
- スタック領域
インスタンスのアドレスやデータ型が保存される - ヒープ領域
データの中身を保存している。ヒープ領域を見に行くことを参照する、という。
シングルトンクラス
普通クラスオブジェクトは複数のインスタンスオブジェクトを作成することができるが、一つのインスタンスを共有すれば良い場合にこのシングルトンクラスを使用する。
これを使うことで一つのインスタンスオブジェクトしか生成できなくなる。
SprintにおけるModel
=リクエストスコープを管理する
リスエストスコープでは1回のリクエスト間、メモリ上にデータを保持できるため
ViewがHTMLを作る際に必要なデータを与えることができる
Intefaceはクラスを自動生成する役割もある
thymeleafとJSP、なぜthymeleafの方が使われるのか
どちらも$の記法があるが、thymeleafの方がデザイナーがthymeleafのファイルをブラウザで見た際にデフォルト値が反映され、画面が崩れない。よって分けて開発してる際には有効。
JSPタグを追加で書いていくため、デザインを邪魔する可能性がある。
@ModelAttribute
Springの@Transaction
@Transaction
をつけることで、自動的にトランザクションの開始、コミット、ロールバックが行われる。
しかし…
ただし、ロールバックの注意点として、非検査例外(RuntimeException及びそのサブクラス)が発生した場合はロールバックされるが、検査例外(Exception及びそのサブクラスでRuntimeExceptionのサブクラスじゃないもの)が発生した場合はロールバックされずコミットされる。
ContextHolder
スレッドローカルに値を保存しておくことで、いろんなところから参照できるようにする。
TomcatなどのAPサーバはリクエストごとにworkerスレッドを割り当てるので、@AsyncやExecutorServiceを利用して別スレッドでXXXContextHolderを利用しない限り、どこからでもスレッドローカルに登録した同じ値を参照できる。
https://www.kimullaa.com/entry/2017/02/18/211448