使用maven构建的多模块项目:LisFunction.jar、YkLis.war。YkLis.war依赖LisFunction.jar,LisFunction.jar包含mybatis文件、dao、service层,YkLis.war包含controller及jsp页面。LisFunction模块的文件结构如下:
YkLis模块的文件结构如下:
applicationContext.xml配置文件内容如下:
    <context:annotation-config/>
    
    <context:component-scan base-package="com.yklis.lisfunction.dao" />
    
    <context:component-scan base-package="com.yklis.lisfunction.service.impl" />
    
    <!-- 读入属性文件 -->  
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
                <!-- 在项目包之外配置是为了部署、升级更方便 -->
                <value>file:/yklis-cfg/jdbc.properties</value>
            </list>  
        </property>  
    </bean>
          
    <!-- 数据源配置 -->
    <bean id="dataSource_master" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="initialPoolSize" value="${jdbc.pool.initialPoolSize}"></property>
        <property name="maxIdleTime" value="${jdbc.pool.maxIdleTime}"></property>
        <property name="maxPoolSize" value="${jdbc.pool.maxPoolSize}"></property>
        <property name="minPoolSize" value="${jdbc.pool.minPoolSize}"></property>
        <property name="checkoutTimeout" value="${jdbc.pool.checkoutTimeout}"></property>
    </bean>
                    
    <!-- 定义JdbcTemplate Bean.这样就可以在JAVA代码中通过@Autowired将Spring容器中的Bean注入进来 -->
    <!-- 如果不在这里定义,也可以在JAVA代码中进行如下定义 -->
    <!-- JdbcTemplate jdbcTemplate = new JdbcTemplate(); -->    
    <!-- jdbcTemplate.setDataSource(ds); -->    
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
            <ref bean="dataSource_master" />
        </property>
    </bean>  
    
    <!-- 注解方式配置事务 -->
    <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
        
    <!-- 声明式事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource_master" />
    </bean> 
    
    <!-- 事务增强 -->  
    <!-- 默认查找名为transactionManager的事务管理器,如果 事务管理器命名为transactionManager,则可不指定transaction-manager属性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">     
        <tx:attributes> 
            <tx:method name="*" propagation="REQUIRED" />    
        </tx:attributes>     
    </tx:advice>    
    
    <!-- 切点表达式语言定义目标方法 -->
    <!-- 第一个*代表所有的返回值类型 
                               第二个*代表所有的类
                               第三个*代表类所有方法 
                               最后一个..代表所有的参数 -->
    <!-- 决定了不能在service层切换数据源。可以执行,但切换不成功(不会报错) -->
    <aop:config>
        <aop:pointcut id="servicesMethod" expression="execution(* com.yklis.lisfunction.service.impl.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="servicesMethod" />  
    </aop:config> 
        
    <!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath*:MyBatis-Configuration.xml"></property>
        <property name="dataSource" ref="dataSource_master" />
    </bean>
    
    <!-- 配置扫描器,扫描value下的所有接口,然后创建各自接口的动态代理类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
        <property name="basePackage" value="com.yklis.lisfunction.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>        
启动时报错如下:
2017-09-27 15:58:41 [localhost-startStop-1]  INFO org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:285) - Root WebApplicationContext: initialization started
2017-09-27 15:58:42 [localhost-startStop-1]  INFO org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:510) - Refreshing Root WebApplicationContext: startup date [Wed Sep 27 15:58:42 CST 2017]; root of context hierarchy
2017-09-27 15:58:42 [localhost-startStop-1]  INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]
2017-09-27 15:58:42 [localhost-startStop-1]  INFO org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:172) - Loading properties file from URL [file:/yklis-cfg/jdbc.properties]
2017-09-27 15:58:42 [MLog-Init-Reporter]  INFO com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger.log(Slf4jMLog.java:203) - MLog clients using slf4j logging.
2017-09-27 15:58:42 [localhost-startStop-1]  INFO com.mchange.v2.log.slf4j.Slf4jMLog$Slf4jMLogger$InfoLogger.log(Slf4jMLog.java:203) - Initializing c3p0-0.9.5.1 [built 16-June-2015 00:06:36 -0700; debug? true; trace: 10]
2017-09-27 15:58:43 [localhost-startStop-1]  WARN org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(AbstractBeanFactory.java:1432) - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
2017-09-27 15:58:43 [localhost-startStop-1]  WARN org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(AbstractBeanFactory.java:1432) - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
2017-09-27 15:58:43 [localhost-startStop-1]  WARN org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:487) - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.yklis.lisfunction.dao.WorkerDao com.yklis.lisfunction.service.impl.WorkerServiceImpl.workerDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.yklis.lisfunction.dao.WorkerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'workerDao' defined in URL [jar:file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/lib/LisFunction-1.0-SNAPSHOT.jar!/com/yklis/lisfunction/dao/WorkerDao.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:/C:/apache-tomcat-7.0.65/webapps/YkLis/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:MyBatis-Configuration.xml]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)

解决方案 »

  1.   

     <context:component-scan base-package="com.yklis.lisfunction.service.impl" />
    service 接口怎么注入的啊?  单独一个配置文件?     
      

  2.   

     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="configLocation" value="classpath*:MyBatis-Configuration.xml"></property>
            <property name="dataSource" ref="dataSource_master" />
        </bean>YkLis.war作为web项目,MyBatis-Configuration.xml也要在它下面而不是LisFunction.jar