spring mybatis circular reference

摘要: Error creating bean with name 'XXX': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException:

如果把MapperScan单独配置,就不会有警告

DataSource,SqlSessionFactory,MapperScan有依赖关系.

如果把MapperScan单独配置,就不会有警告,例如:

code:

DataSource:

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @ConfigurationProperties("spring.datasource.druid")
    @Bean
    public DataSource equipDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

}

SqlSessionFactory:

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@SuppressWarnings("SpringJavaAutowiringInspection")
@Configuration
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.app.domain.entity");// 指定基包
        factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/**/*.xml"));//
        return factoryBean.getObject();
    }

}

MapperScannerConfigurer

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.spring.mapper.MapperScannerConfigurer;

import java.util.Properties;

@Configuration
public class MapperConfig {

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.app.domain.mapper");
        Properties properties = new Properties();
        // 这里要特别注意,不要把BaseMapper放到 basePackage 中,也就是不能同其他Mapper一样被扫描到。
        properties.setProperty("notEmpty", "false");
        properties.setProperty("IDENTITY", "MYSQL");
        mapperScannerConfigurer.setProperties(properties);
        mapperScannerConfigurer.setMarkerInterface(BaseMapper.class);
        return mapperScannerConfigurer;
    }

}

 

 

 

 

https://my.oschina.net/doctor2014/blog/386431

 

Requested bean is currently in creation: Is there an unresolvable circular reference?


 getBean的时候由于bean之间存在循环依赖出现类似的错误,先做一个简单实验模拟一下这个异常出现的原因:

bean.xml配置如下:

<?xml version="1.0" encoding="GBK"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"

       default-autowire="byName">

<bean id="a" class="BeanA" scope="prototype"/>

<bean id="b" class="BeanB" scope="prototype"/>

</beans>

 

BeanA类如下:

public class BeanA 

{

private BeanB b;

public BeanB getB() {

return b;

}

public void setB(BeanB b) {

this.b = b;

}

}

 

BeanB类如下:

public class BeanB 

{

private BeanA a;

public BeanA getA() {

return a;

}

public void setA(BeanA a) {

this.a = a;

}

}

程序执行的堆栈信息:


 
bean在初始化的同时会初始化相应的属性(byName),a在初始化的时候会创建a.b,a.b在初始化的时候会创建a.b.a,形成了一个环,所以在AbstractBeanFactory.doGetBean(这里会出现递归调用) 时候 ,走到:

if (isPrototypeCurrentlyInCreation(beanName)) {

throw new BeanCurrentlyInCreationException(beanName);

}

会抛出一个异常:Requested bean is currently in creation: Is there an unresolvable circular reference,然后scope是singlton或者其他的时候bean的创建过程不一样,不会有一个这样子的判断,因而不会抛出这样子的错误。

因为scope=prototype,所以每次请求对应不同的bean,所以在创建的时候有一个依赖的先后顺序,而如果bean配置成singleton,则属性间初始化的顺序可以无所谓了,所有的bean都只有一份,所以在bean是singleton时候不会报unresolvable circular reference的错误。

 

时间: 2024-09-18 13:34:55

spring mybatis circular reference的相关文章

spring+mybatis,事务不起作用,求帮忙

问题描述 spring+mybatis,事务不起作用,求帮忙 spring + mybatis,开始annotation式事务 配置如下: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="data

spring+mybatis 频繁出现数据库连接失败问题,mysql timeout时间设长也无效

问题描述 spring+mybatis 频繁出现数据库连接失败问题,mysql timeout时间设长也无效 mysql会频繁的出现以下异常,以为是mysql的8小时超时问题,根据网上说的,已经把mysal的time_out时间设到很大了.但是貌似没有效果. wait_timeout=2147483 interactive_timeout=2147483 请问哪位知道以下问题的原因吗 以下数据源的配置 <!-- Connection Info --> <!-- Connection Po

spring,数据符,spring+mybatis

问题描述 spring,数据符,spring+mybatis 利用spring+mybatis怎样写一个应用数据符呢?还是通用的那种,还有,应用数据符是什么?有什么用?如何去用呢?大神们,求帮忙!快快快...感激不尽! 解决方案 MyBatis数据持久化(十)与Spring4整合

spring+mybatis 的ExecutorType模式修改

问题描述 请问现在的项目使用的是spring+mybatis,原始项目对于数据库交互方式ExecutorType的模式设置的是SIMPLE,由于对数据库更新的效率实在是令人担心,想将其修改为BATCH模式,我是小白,所以想向各位请教:1.batch模式对于数据库INSERT操作中,如果暗含了ID自增会出现什么样的问题2.修改batch模式后,对于从前的DAO层定义的<bean>需要进行调整吗谢谢 解决方案 解决方案二:项目是默认的,帮顶解决方案三:JAVASpringMVC+mybatis(o

请教怎么配置springmvc+spring+mybatis的事务,手动控制的

问题描述 请教怎么配置springmvc+spring+mybatis的事务,手动控制的 请教怎么配置springmvc+spring+mybatis的事务,手动控制的 解决方案 mybatis spring事务配置spring整合mybatis之事务配置 解决方案二: 呵呵 事务如果不配置 默认 就是需要手动使用的吧 既然你要手动的 那就不配置就行了, 如果已经配置了 事务一般都是 xml配置 或者注解,取消注解,或者xml中取消匹配方法的配置不就行了

mybatis-使用spring+Mybatis 注解无效

问题描述 使用spring+Mybatis 注解无效 使用spring+Mybatis,使用spring注解,一直报空指针异常,各位麻烦看看 这个spring文件 <?xml version="1.0" encoding="UTF-8"?> xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/s

Struts2+spring+mybatis上传图片获取不到文件上传名字

问题描述 Struts2+spring+mybatis上传图片获取不到文件上传名字 java /** * * 图片上传 * */ public String doupload() { MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext()); MultipartHttpServletRequest multipartRequest = resolver.r

java+Spring+mybatis 查询sql报错:无效的序列号!

问题描述 java+Spring+mybatis 查询sql报错:无效的序列号! java+Spring+mybatis+lucens+达梦数据库.应该能判断和数据库和lucen没关系.,着急在线等!mybatis: SELECT COUNT(*) FROM ""user_task"" title"" like '%""#{title}""%' And ""status"&qu

我在框架融合的中遇到一些问题!(DWR+EXT+Spring+mybatis )

问题描述 我在框架融合的中遇到一些问题!(DWR+EXT+Spring+mybatis ) 我的服务器是 WAS的 在服务器上的日志文件中,查看到这样输出. 输出:[16-1-15 9:53:35:449 CST] 00000070 SystemOut O 2016-01-15 09:53:35449 [INFO ]: 保存[16-1-15 9:53:35:449 CST] 00000070 ClassPathXmlA I org.springframework.context.support.