zoukankan      html  css  js  c++  java
  • maven多模块Springmvc+mybatis读取配置文件和注入bean

    maven多模块Springmvc+mybatis读取配置文件和注入bean

    Posted on 2016-10-26 17:26 疯狂的码奴 阅读(1587) 评论(0)  编辑 收藏

    最近在使用由maven构建的多模块项目,在开发过程中遇到了一些问题,在此记下解决的方法希望对出现同样或类似问题的朋友有所帮助。

    首先说下我使用的技术,maven +springmvc +mybatis

    注:整个项目使用spring的注解方式来实现管理。

    然后说下我的项目结构:

    root

    --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,请求控制类等。

    以上是项目的整体介绍,下面将主要阐述在开发中遇到的问题。

    1、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包中进行查找。这个在第二个问题中用到了

    2、配置文件加载成功,但提示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中均已测试成功。

    以上就是本人遇到的问题和解决办法。

  • 相关阅读:
    Finder那点事
    mysql基础综述(四)
    【算法编程】过河问题
    CodeForces 7D Palindrome Degree 字符串hash
    语音信号短时域分析之预处理(三)
    sqlite学习笔记7:C语言中使用sqlite之打开数据库
    cpu真实占用率检測工具
    Mediator Design Pattern 中介者模式
    POJ-3984-迷宫问题-BFS(广搜)-手写队列
    HDU 4858 项目管理
  • 原文地址:https://www.cnblogs.com/liuyingke/p/7610291.html
Copyright © 2011-2022 走看看