見出し画像

JAVA Spring Bootのまとめメモ

MQ連携(メッセージキューイング)

ライフサイクル

複数のプラグインを内包するもの

ゴール
プラグインには1つ以上のゴールを持つ

ゴールが最小単位
ライフサイクル>プラグイン>ゴール(コマンド1つくらいの単位)

static 変数

static句を使うとそれが含まれるクラスをインスタンス化せずにその変数にアクセスすることができます。この変数のことを「static変数」と呼びます。
これに対して「static」句を使わない変数はそのクラスをインスタンス化しなければ、その変数にはアクセスできません。この変数のことを「非static変数」と呼びます。
「static変数」は「クラス名.」の後に記述しますので「クラス変数」、「非static変数」は「インスタンス名.」の後に記述しますので「インスタンス変数」とも呼ばれます。
「クラス変数」はクラス内の変数、「インスタンス変数」はインスタンス固有の変数となります。

https://www.sejuku.net/blog/22426

Atomic操作

JAVAの並行処理の手法

スレッドセーフでない場合、複数のスレッドから呼び出されると、正しい動作が保証されない 競合状態を発生させず、この処理をスレッドセーフにするには、この操作をアトミックにする必要がある。 アトミックとは不可分操作と呼ばれ、他のスレッドには割り込みをさせず、今行なっている変更操作が確実に終わった後に実行できること

https://qiita.com/stk_odoroki/items/bddaeec8775406c63258

解決方法
→count 変 数を int 型ではなく、AtomicInteger クラスを使用する。(スレッドセーフクラスを使用する)

classクラスがある

→classが何ができるのか定義されている

アノテーション

アノテーションとは、英語で「注釈、注記」などの意味がある言葉です。
Javaのコード上では"@(アットマーク)"からはじまり、コードでは表現しきれない情報を、補足としてつけ加えられます。
具体的に記述する場所は
・クラス
・インターフェース
・メソッド
・メンバ変数
・メソッド引数

https://ec-orange.jp/ec-media/?p=17791

Spring Bootの作法

  • @を使うとクラス名を定義できる

  • @SpringBootApplication アノテーションによりこのクラスのパッケージ配下のコ ンポーネントスキャンやその他自動設定などが有効となる

Spring Framework

→DI(Dependency Injection)設定パターン(DIコンテナ)
  →自分が使いたいインスタンスを外部から設定してもらう。(≒newがなくなる。)

DIコンテナにインスタンスと登録方法は以下

  • JavaConfig による明示的な登録

  • コンポーネントスキャンによる自動登録

コ ンポーネントスキャン

コンポーネントスキャンによる自動登録
→@hogafugaと@マーク(アノテーション)をつけると使用することができる。
  →@serviceとすると、serviceという名前でインスタンス化される。

@Bean

Spring Frameworkの言葉。

@Beanと書いたメソッドでインスタンス化されたクラスがシングルトンクラスとしてDIコンテナに登録される。任意のクラスで@Autowiredで注入してアクセスできる。

https://dev.classmethod.jp/articles/springboot-what-is-bean/

ここも参考になる

インジェクション

DI コンテナの管理対象となったインスタンスをインジェクション(注入)させるには @Autowired を付与します。対象の型が一致するインスタンスを DI コンテナが自動で注入 します。Spring Framework の DI コンテナは、以下の 3 種類のインジェクション方法をサポー ト

  • コンストラクタインジェクション

  • フィールドインジェクション

  • セッターインジェクション

→DI の実装方法としてコンストラクタインジェクションを使用すべき

推奨されている方法はコンストラクタインジェクションです。インジェクションするフ ィールドに final を指定することを推奨します。利点は以下

  • テスト時にモックに差し替えやすい

  • final を指定することで、内部メソッドまたはサブクラスでフィールドを書き換えら れるのを防止できる(書き換えるコードを記述するとコンパイルエラーとなります)

Compliant Solution(解決方法)

@RestController
@RequestMapping("/antipattern")
public class InjectionController {
  private final InjectionService service;

  public InjectionController(InjectionService service) {
    this.service = service;
  }

  @GetMapping("injection")
  public String injection() {
    return service.getMessage();
  }
}

AOP

AOP とは Aspect Oriented Programmingの略で、アスペクト指向に基づいたプログラミングのこと
クラスの持つ責務に基づいて、クラス内には本質的な処理だけを記述で きるようにするために使用する技術
AOPを使うと、トランザクション(コミットあるいはロールバック)やlogger・例外処理を、クラスとして纏めることができる。

主な例外クラスの種類

<検査例外と非検査例外>

Java における例外には大きく「検査例外(チェック例外)」と「非検査例外(非チェック例外)」がある

・検査例外とは

検査例外は java.lang.Exception クラスのサブクラスの内、java.lang.RuntimeException のサブクラスでないものを言います。検査例外は、メソッドまたはコンストラクタ throws 節で宣言する、または try~catch で捕捉し例外処理をあらかじめプログラムする必要があ ります。未実装の状態ではコンパイルでエラーとなります。

一般的に、プログラムで回復不能な例外をあらかじめ定義する際に使用されます。

・非検査例外とは

非検査例外は java.lang.RuntimeException のサブクラスを言い、実行時例外とも呼ば れます。非検査例外はメソッド、またはコンストラクタ実行時に発生し、コンパイル時点で はどの非検査例外が発生するのか確認することができません。

一般的に、データとプログラムの不整合など、事前に対処しておくべき事象で発生します。

${}は使ってはだめ。

SQLインジェクションの原因になる
→#{}を使用すべし

ログ出力ライブラリ
SLF4Jでプログラムは書かれている。
ログ出力用ライブラリには以下のように様々なものがある

  • Log4J

  • java.util.logging(Java 標準機能)

  • Logback

→デフォルトのライブラリは「Logback」

Controller→Service→Repository

MVCで言えば、
C=Controller
V=Service
M=Repository
的な感じ

singleton スコープ

@Component を付与したクラス(Bean)のスコープは、デフォルトでsingleton になります。 インスタンス化されるのは 1 度だけです。
@Component を含んでいる、@Controller、 @RestController、@Service、@Repository を付与したクラスも同様となります。
singleton スコープは不必要なインタンス生成をせず、サーバに負荷をかけないため、推 奨される設定となります。

参考


いつもサポートありがとうございます。 あなたの100円がモチベーションアップの起爆剤です。 毎日更新頑張ります Twitterはこちら https://twitter.com/7010Rei