今天在公司测试功能时发现一问题:
先进行代码说明:
1,controller配置了Scope="prototype"(表明每一次请求都是原子型)
@resource/@autowired service对象都可以(两种注解都可以)。
2,service 配置了Scope="prototype"(表明每一次请求都是原子型)
@resource dao对象(不会报错)
@autowired dao对象(出错)
错误如下
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.wifiapp.dao.AppDao] 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)}
3,dao配置了scope="prototype"(applicationContext.xml中配置的,没有使用注释,只有controller,service使用注解配置)
--------------------------------------------------------------------------------
使用以上配置(scope='prototype')的目的就是希望每一次请求都是新new的对象,而不是重新注原来的对象,结果却出现以上错误。
原因分析如下(如不对请指出)
@autowired是以类名注入的方式(如UserService userService,真正的类型是UserServiceImpl,所以可以成功注入),而mybatis中是基于接口的dao,没有具体的实现类;并且配置也是如下形式(<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">,并不是我们所指的实现类),所以不能成功注入。
@resource如果配置了name,则先name注入(作者配置了@resource(name='userDao')所以成功注入),如果没有配置name值,则以变量名注入,如下:
@Resource
private UserDao userDao;
则以userDao为变量名注入(由于配置了name值和当前情况相同,所以都可以注入)。
如下则不能注入
@Resource
private UserDao userDaoTMD;
则不能正确注入,也会出现上面的异常情况。
综合以上情况,可以看下,根据类型的注入方式都会出错。spring+mybatis注入dao对象时要当心,整合spring+mybatis注入dao对象时,最好使用@resource(name='xxxDao')的方式
情况1失败:
Service:
@Service(value = "appService")
@Scope("prototype")
public class AppServiceImpl implements AppService {
@Resource
private AppDao appDaoTMD;
Dao:
<!-- 配置操作Mapper 每一个Mapper都需要注入sqlSessionFactory -->
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
-----------------------------
情况2失败:
Service:
@Service(value = "appService")
@Scope("prototype")
public class AppServiceImpl implements AppService {
@Autowried
private AppDao appDao;
Dao:
<!-- 配置操作Mapper 每一个Mapper都需要注入sqlSessionFactory -->
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
-----------------------------
情况3正确:
Service:
@Service(value = "appService")
@Scope("prototype")
public class AppServiceImpl implements AppService {
@Resource(or @Reource="appDao")
private AppDao appDao;
Dao:
<!-- 配置操作Mapper 每一个Mapper都需要注入sqlSessionFactory -->
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
如有不正确的地方,请指出。
分享到:
相关推荐
Mybatis与Spring的集成使得事务管理、数据访问对象(DAO)的创建和管理变得更加简单,避免了传统的JDBC代码繁琐和易出错的问题。 在"MavenWebDemo"这个项目中,我们可以看到一个典型的Java Web开发流程。开发者首先...
在Dorado+Spring+Mybatis的整合项目中,Mybatis将作为数据访问层,负责数据库的CRUD操作。 【整合项目】 Dorado+Spring+Mybatis的整合意味着将这三个框架集成到同一个项目中,实现数据访问、业务逻辑控制和用户界面...
3. **Spring与Mybatis的整合**:在企业应用中,Spring和Mybatis的结合使用是常见的实践。Spring通过DataSource、SqlSessionFactoryBean等组件来管理数据源和Mybatis的SqlSessionFactory,使得Mybatis可以在Spring...
mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in ...
Spring作为服务层,利用其强大的依赖注入特性,可以管理Struts2中的Action以及MyBatis中的SqlSessionFactory,使得对象实例化和依赖关系的配置变得简洁。MyBatis则与数据库交互,执行SQL查询和更新操作。 Spring3.0...
在提供的压缩包中,`mybatisspringutils.zip`可能包含了一组预先配置好的MyBatis-Generator工具和Spring整合的示例项目。`dom4j-1.6.1.jar`是一个Java库,用于处理XML文档,它是MyBatis-Generator依赖的一部分。而`...
4. **整合到项目**:将生成的文件添加到项目中,配置Spring或其他依赖注入框架来管理和使用这些DAO和Mapper。 5. **测试**:最后,编写测试用例验证生成的代码是否能正确地执行SQL并返回预期结果。 通过MyBatis ...
- 在Spring整合MyBatis时,通常会使用`@Autowired`注解注入Mapper接口,但这种方式在多线程环境下可能会出现问题。因为Spring默认的单例模式可能导致多个线程共享同一个Mapper实例,而Mapper通常不设计为线程安全的...
MyBatis-Spring-Kotlin 是一个针对 MyBatis 框架与 Spring 的高效整合方案,旨在为使用 Kotlin 语言的开发者提供更加流畅的数据库操作体验。这个适配器作为连接 MyBatis 和 Spring3 的桥梁,简化了在 Spring 应用中...
- 创建Service层和DAO层:Service接口定义业务逻辑,实现类注入DAO并调用其方法;DAO接口定义数据库操作,实现类继承SqlSessionDaoSupport并实现具体逻辑。 **6. 运行与调试** 项目通常使用Maven或Gradle构建,通过...
依赖注入允许开发者通过配置文件或注解来管理对象之间的关系,而非硬编码这些关系,使得代码更加灵活,易于测试和维护。面向切面编程则允许开发者将关注点分离,如日志、事务管理等,从主业务逻辑中抽离出来,提高...
这样,我们可以在Spring的配置文件中定义数据源、事务管理器、SqlSessionFactoryBean等,然后通过@Autowired注解注入到需要使用iBatis的Service层或DAO层。 在"spring+ibatis整合jar包"中,通常包含以下组件的jar...
4. **Service层**:业务逻辑通常放在Service层,Spring的DI使得我们可以轻松地注入DAO,执行数据操作。 5. **Controller层**:在Spring MVC中,Controller接收HTTP请求,调用Service层的方法,然后将结果返回给视图...
在Spring框架中,你可以使用@Autowired注解来注入DAO实现,然后调用其方法进行数据库操作。 5. **更新与维护**:随着数据库表结构的变化,你可以重新运行MyBatisGenerator,它会根据最新的表结构更新生成的代码。这...
【Spring与Hibernate、Maven和Transaction的整合】 在现代Java Web开发中,Spring框架、Hibernate持久化工具和Maven构建工具是不可或缺的部分。Spring提供了强大的依赖注入和面向切面编程能力,Hibernate则简化了...
同时,Spring的DAO(Data Access Object)支持和ORM(Object-Relational Mapping)集成,如Hibernate或MyBatis,可以极大地简化数据库操作。 当Struts、JDBC和Spring结合使用时,Spring可以作为底层的IoC容器,管理...
- MyBatis的配置通常包括`mybatis-config.xml`,在本项目中可能已整合到Spring中,因此不在单独的文件中。这个文件主要配置MyBatis的基本属性,如SqlSessionFactory,Mapper扫描路径等。 3. **Spring MVC配置**: ...
SSM(Spring、SpringMVC、MyBatis)框架整合是Java开发中常见的技术栈,主要用于构建企业级的Web应用程序。下面将详细讲解这三个框架的基本概念、作用以及整合过程中的关键知识点。 **Spring框架** Spring是Java...
4. **持久层支持**:Spring通过DAO(数据访问对象)模式和ORM(对象关系映射)框架的集成,如Hibernate和MyBatis,使得数据库操作更加简单,降低了数据库访问的复杂性,支持声明式事务管理,使得事务处理更为便捷。...
- **自动化管理**:Spring的依赖注入和AOP使得对象的创建和管理变得简单,降低了出错的可能性。 - **测试友好**:由于解耦,单元测试和集成测试变得更加方便。 7. **实战示例** 在"springmvc-mybatis"项目中,...