Help us understand the problem. What is going on with this article?

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

はじめに

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側とビジネスロジック側で分けて開発していきます

root-context.xmlの詳しい解説

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->
    <context:component-scan
        base-package="com.dreamhanks" />


    <!-- MySQL dataSource -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"
            value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
        <property name="url"
            value="jdbc:log4jdbc:mysql://localhost:3306/work_db?useSSL=false&amp;serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="Daiki8863"></property>
    </bean>

    <!-- mybatis SqlSessionFactoryBean -->
    <bean id="sqlSessionFactory"
        class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation"
            value="classpath:/mybatis-config.xml"></property>
        <property name="mapperLocations"
            value="classpath:mappers/**/*Mapper.xml"></property>
    </bean>

    <!-- memberMapper -->
    <bean id="memberMapper"
        class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface"
            value="com.dreamhanks.dao.MemberMapper" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>

    <!-- worktimeMapper -->
    <bean id="worktimeMapper"
        class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface"
            value="com.dreamhanks.dao.WorktimeMapper" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>

    <!-- mybatis -->
    <bean id="sqlSession"
        class="org.mybatis.spring.SqlSessionTemplate"
        destroy-method="clearCache">
        <constructor-arg name="sqlSessionFactory"
            ref="sqlSessionFactory"></constructor-arg>
    </bean>

</beans>

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

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

    <context:component-scan
        base-package="com.dreamhanks" />

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

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

dao, dto, form, service, workmanager(コントローラ)があります。

無題.png

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

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

<context:component-scan     
    base-package="com.dreamhanks.service" />    
<context:component-scan     
    base-package="com.dreamhanks.dao" />    
<context:component-scan     
    base-package="com.dreamhanks.dto" />    

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

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

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

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

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

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

連携をするためには

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

無題.png

▼ビジネスロジックからDaoの参照などの説明をしていく

▼MyBatisジェネレータとの連動の画像も用意してそれの説明をする

▼順番に詳細の説明をする

▼記事のタグを見直す

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

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

    <!-- MySQL dataSource -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"
            value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
        <property name="url"
            value="jdbc:log4jdbc:mysql://localhost:3306/work_db?useSSL=false&amp;serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="Daiki8863"></property>
    </bean> 

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

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

よってJavaはオブジェクト指向言語なので「bean id="dataSource"」がクラスということは、
オブジェクトとして扱うことができるようになります。

MySQLとmybatis-config, mappaerを連動させる

ここでは下記の2つの役割を記述しています。
①MySQLとMappperを連動させるため
②MySQLとMyBatisを連動させるため

    <!-- mybatis SqlSessionFactoryBean -->
    <bean id="sqlSessionFactory"
        class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation"
            value="classpath:/mybatis-config.xml"></property>
        <property name="mapperLocations"
            value="classpath:mappers/**/*Mapper.xml"></property>
    </bean>

①MySQLとMappperを連動させるため

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした