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中均已测试成功。

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

  • 相关阅读:
    格式化数字,将字符串格式的数字,如:1000000 改为 1 000 000 这种展示方式
    jquery图片裁剪插件
    前端开发采坑之安卓和ios的兼容问题
    页面消息提示,上下滚动
    可以使用css的方式让input不能输入文字吗?
    智慧农村“三网合一”云平台测绘 大数据 农业 信息平台 应急
    三维虚拟城市平台测绘 大数据 规划 三维 信息平台 智慧城市
    农业大数据“一张图”平台测绘 大数据 房产 国土 农业 信息平台
    应急管理管理局安全生产预警平台应急管理系统不动产登记 测绘 大数据 规划 科教 三维 信息平台
    地下综合管廊管理平台测绘 大数据 地下管线 三维 信息平台
  • 原文地址:https://www.cnblogs.com/liuyingke/p/7610291.html
Copyright © 2011-2022 走看看