基本的にドキュメントにしたがってapplication.ymlを書けば勝手に接続できてしまう感じなんだが、やっぱアノテーションとかAutoConfigurationとかって黒魔術的で、どういう機能があるのかが網羅的にわかる(わかりやすい)ドキュメントとセットじゃないと結構厳しい気がする。
で、SpringFrameworkとかSpringBootとかって調べてもいろんな前提事情が混在した情報が出てくるので、知識がないと必要な情報の判断ができないような状況になっている気がする。
そうなるとコードから実態を追いたくなるが、ここがアノテーションとか自動設定で見えにくいようになっているので、なかなかとっつきづらい感じになってるんじゃないかなぁ、、とか思ったりしている。
で、データベースの接続周りがどのようになっているのか調べて分かった範囲で雑にメモしておく。
JDBCとDataSourceについて
JDBCはJavaを使ってDBとかに接続する際、DBの種類ごとに異なる接続手順とかを意識しないでいいように抽象化してくれる仕組み的なやつ。 コネクションプール機能とかもここに含まれてる。
で、JDBCで扱うDB(だけじゃないかも)接続情報がDataSourceというインターフェースで、これをつかってコネクションを取得する。
AutoConfigurationについて
SpringBootだとapplication.ymlとかにspring.datasource.urlとか必要な設定を書いておくともうDataSourceをDIして使うことが出来てしまう。 このあたりどうなっているのか?
これはAutoConfigurationという仕組みが実施している。 具体的にはorg.springframework.boot.autoconfigureというパッケージに色々設定があって、その中にDataSourceAutoConfigurationというclassがある。 DataSourceをBeanとしてDIコンテナに登録する設定が含まれている。
org.springframework.boot.autoconfigureパッケージのMETA-INF以下にspring.factoriesというファイルがあり、ここに記載されいてる設定ファイルをSpringBootは自動的に読み込むらしい。 そういうわけで、DataSourceは「自分でインスタンス化の手順を書いてDIコンテナに登録」しなくてもapplication.ymlを書くだけで使うことが出来るようになる。
MyBatisとかDB関連の便利ライブラリについて
MyBatisとかも接続情報は上記したDataSourceを使うので(MyBatisのAutoConfiguration周りを見ると、DataSourceがDIされるように書いている)接続情報は共通してapplication.ymlのspring.datasource.urlとかから読み込まれる。
だから、これもpom.xmlにdependencyを追加するだけで、もうDIして使えるようになる。