【Webアプリ開発】root-context.xmlの解説

Javaウェブアプリ開発

はじめに

DreamHanksの松下です。今回はroot-context.xmlの解説をしていきます。

データベースはMySqlを使い、
DBアクセスはMyBatisというオープンソースのO/Rマッピングツールを使っています。

連載記事まとめ

 

contextファイルとは

Springフレームワークを使ってアプリ開発をする際のプロジェクトの構成ファイルです。

ビルドするときにcontextファイルの中のbeanオブジェクトを使い
そのオブジェクト内に設定されているvalue値から、何かと何かを参照できるようにする(繋げる)役割があります。

具体例としては以下のものが挙げられます。
・データベースの参照・接続
・Serviceクラスからdaoのインターフェースメソッドを呼んだ際にMapperクラスの記述されているsql文を参照する。
・ControllerクラスとJSPファイルの参照

 

root-context.xmlとservlet-context.xmlの違いとは

root-context.xmlはビジネスロジックに関連するものを定義するためのものです。
例)データベースの参照・接続にかかわるもの

servlet-context.xmlはViewに関連するものを定義するためのものです。
例)ControllerクラスとJSPファイルの参照

ビジネスロジックとは、計算ロジックやDBとのやり取りをするソースコードです。

実際に開発をするときはServiceクラスというものを用意し、
そこに計算ロジックやDBとのやり取りをするメソッドを共通部品のように作成します。

そしてそれらをControllerクラスで呼び出すというようにView側とビジネスロジック側で分けて開発していきます。

「画面側の仕事」と「計算/DBアクセスの仕事」を分けることで、簡潔なシステムを開発できます。

 

root-context.xmlの詳しい解説

上記のroot-context.xmlの記述について詳しく解説をしていきます。

 

サーバーにスキャン(認識)させる

上記のソースコードは「com.dreamhanks」以下のソースコードをサーバーにスキャン(認識)させるための記述です。

 

「com.dreamhanks」以下のソースコードに何があるのか?

下記の5つのモジュールがあります
・dao
・dto
・form
・service
・workmanager(コントローラ

無題.png

「root-context.xmlとservlet-context.xmlの違いとは」で解説したように、
root-context.xmlではビジネスロジックに関連することを定義するためのものです。

したがって、formやworkmanager(コントローラ)は関係なく、下記のようにdto, dao, serviceのみを定義することもできます。

 

3つのみを定義することのメリットとは?

モジュールが大きくなければ、すべてスキャンしても所要時間少なくて済みます。

しかし大きなモジュールの場合「com.dreamhanks」以下のソースコードを
全てスキャンすることはform, workmanager(コントローラ)の分も
スキャンしてしまうので所要時間がその分多くかかります。

よって上記3つのみを定義することは大きなモジュールの場合、有益に働きます。

 

 

具体的に何を認識させるのか?

ソース内に記述されているアノテーションをスキャンすることで、サーバーに下記の事柄を認識させます。
・サーバーにどのクラスがサービスなのか?
・どのクラスが@AutowiredなどのDependency Injection(依存性の注入)があるのか?

Dependency Injection(依存性の注入)についての詳しい解説は下記のリンクをご覧ください(2020/09/16工事中)

 

コードとコードの連携の仕組み

context:component-scanタグから下の何かと何かの連携をさせるための記述について解説していきます。

◆ソースコードとデータベースがどのような流れで繋がるのか?

無題.png

上記の図はroot-context.xmlの下記のbeanの定義によって
Serviceクラスでのメソッド呼び出しから、MySqlへのDB操作の連携の流れを表しております。
・<!– MySQL dataSource –>
・<!– mybatis SqlSessionFactoryBean –>
・<!– memberMapper –>
・<!– worktimeMapper –>
・<!– mybatis –>

一つづつ順番に見ていきます

 

①ServiceクラスとMapperクラスを繋げる

下記の記述はServiceクラスとMapperクラスを繋げるためのものです。

各マッパーのbeanマッピングは、
MyBatisジェネレータで作成したDao,Dto,Mapperの数分を記述します。

今回はmemberテーブルとworktimeテーブルを
MyBatisジェネレートしたので、2つのマッピングを記述しました。

 

★マッピング構造を理解する

マッピング構造を理解して、上記の記述が
どのようにServiceクラスとMapperクラスを繋げているのかを解説します。

上記のマッピング構造をjavaソースに置き換えて解説すると下記のようになります。
無題.png

上記の記述は「継承クラス名:org.mybatis.spring.mapper.MapperFactoryBean」
を継承する「クラス名:memberMapper」オブジェクトとして扱うことができるようになります。

 

上記の記述は「変数名mapperInterface」で
「値:com.dreamhanks.dao.MemberMapper」を持ち「sqlSessionFactory」を参照するという意味です。

 

②MapperクラスとMappersクラスを連動させる

Mapperクラスにはインターフェースのメソッドが記述されています。
Mappersクラスには実際にSQL文がXML形式で記述されています。

上記の記述はメソッドとSQL文の架け橋をしてくれます。

 

③各テーブルのマッピングと<!– mybatis –>を連動させる

この記述は下記の2つの役割があります。
①MySQLとMappperを連動させるため
②MySQLとMyBatisを連動させるため

 

上記の記述は「dataSource」を参照するという意味です。
次の「MySQLとmybatis-config, mappaerを連動させる」ための記述です。

上記の記述はmybatisのconfigファイルの位置を示しています。
具体的にはMyBatisジェネレータを実行する際に、configファイルとDBを連動させるための記述です。

 

上記の記述は「Mapper.xml」の位置を示しています。
この記述が「各テーブルのマッピング」と「<!– mybatis –>」が
「sqlSessionFactory(このマッピング)」を参照している理由です。

この記述によって「各テーブルのマッピング」と「<!– mybatis –>」が紐づきます。

 

④SpringフレームワークとMySqlを連動させる

ここではSpringフレームワークとMySQLを連動させるために下記の記述を書いています。

「各テーブルのマッピング」と「<!– mybatis –>」が紐づきを記述している
「sqlSessionFactory」はこの「dataSource」を参照しています。

 

上記の記述は下記の定義をしています。
「url」    ⇒ DBの場所
「username」 ⇒ DBのアカウント名
「password」 ⇒ DBのpassword

この「dataSource」を参照することによって、最終的にDBとの接続を行えるようになります。

 

 

コメント