< Maven多模塊工程+Springmvc+mybatis>讀取配置文件和注入bean


最近在使用由maven構建的多模塊項目,在開發過程中遇到了一些問題,在此記下解決的方法希望對出現同樣或類似問題的朋友有所幫助。

轉載自博客園本文鏈接地址: maven多模塊Springmvc+mybatis讀取配置文件和注入bean

項目技術:maven,springmvc,mybatis

項目結構:

+++++++++++++++++++++

+ root

   -> pom.xml

+ dao

+ service

+ common

+ web

+++++++++++++++++++++

root:是父模塊,dao,service,common,web分別是四個子模塊,每個子模塊是一個單獨的工程,由maven管理依賴關系來實現相互的調用。依賴關系的建立就是在pom.xml中通過dependency來實現。

dao:工程是負責數據庫訪問的,其中包含了mybatis的映射文件、dao的數據訪問接口和spring-mybatis.xml配置文件(配置數據庫連接和數據源信息)。

service:工程負責業務邏輯處理,其中包含業務邏輯處理接口與實現類。

common:工程主要放置常量、工具類等

web:工程負責視圖與請求控制,其中包含web.xml、spring-mvc.xml,請求控制類等。

以上是項目的整體介紹,下面將主要闡述在開發中遇到的問題。

:整個項目使用Spring的注解方式來實現管理。

dao模塊的配置文件讀取問題

由於部署的只有web工程,其他工程最后會被Maven打成jar作為web工程的依賴進行調用。同時web項目在啟動時只會加載WEB-INF目錄下的配置文件,這就會導致jar包里的配置文件無法被讀取,最終無法實例化service和dao的bean,導致調用失敗。

解決辦法:在web.xml里加入

<!-- 加載spring的xml配置文件到 spring的上下文容器中 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:xxx.xml</param-value>
</context-param>

注:加載jar包中的配置文件可能會出現無法支持通配符的情況,如果有多個配置文件需要一個一個的加 例:

<!-- 加載spring的xml配置文件到 spring的上下文容器中 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath:xxx1.xml,xxx2.xml
   </param-value>
</context-param>

另外在網上也看到說以上方法仍無法加載,並提供了解決辦法,由於本人使用以上方法已經成功,無法進行驗證,但還是貼出來供大家參考:

<!-- 加載spring的xml配置文件到 spring的上下文容器中 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath*:xxx1.xml,xxx2.xml
    </param-value>
</context-param>

辦法就是在classpath后加*號 ,網上的解釋是classpath 只會在classpath中查找 ,classpath*會在classpath和所有的jar包中進行查找。這個在第二個問題中用到了

 

配置文件加載成功,但提示dao的bean綁定無效

在調用過程中使用的是@AutoWired自動注入的形式。出現綁定無效的情況大致分為以下幾種情況。

a、配置文件中未開啟支持注解的方式注入   

<!--查看配置文件中是否有以下代碼-->
<context:component-scan base-package="..."></context:component-scan>
<!--這個代碼是開啟包自動掃描同時開起對注解的支持-->

b、映射文件的namespace引用路徑錯誤

    由於使用了spring版本是支持mybatis3的,可以通過配置

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <property name="basePackage" value="..." />
       <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>

    來達到不需要dao實現類的目的。但同時需要映射文件中的namespace中的類路徑必須和dao接口類路徑一致,dao接口類中的方法名與映射文件中的CRUD方法的id一致。

c、映射文件中沒有dao接口類中調用的方法。

    b中提到了dao接口類的方法名需要和映射文件中的方法id一致,如果不一致將無法對應

d、如果上述的問題都不存在(本人也是沒有上述問題),那么我們再回到配置文件中

    我們在整合spring和mybatis的時候往往會去掉mybatis的配置文件,需要在配置文件中配置 

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource" />
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:xxx/xxx/*.xml"></property>
</bean>

    從上面的配置信息中我們又看到了classpath,在第1個問題中我們提到過,classpath只會在classpath中查找 ,dao模塊已經是以jar包的形式存在了 ,因此 classpath應該是web工程的,所以找不到。

    解決辦法就是在classpath后加一個*就解決了

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations"value="classpath*:xxx/xxx/*.xml"></property>
</bean>

經過junit和部署到tomcat中均已測試成功。

以上就是本人遇到的問題和解決辦法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM