SpringBoot注解循环依赖

SpringBoot注解循环依赖

  • 今天在进行redis链接池配置代码时,运行测试时发现了一个循环依赖问题,在此记录下

问题所在

  • 由于我在同一个类中对redis链接池进行配置,使用@Bean将返回的链接池对象(jedisPool)配置到IOC容器中,同时又使用@Autowired将该IOC容器的对象(jedisPool)注入到依赖的成员变量中,导致了循环依赖错误。
@Service
public class RedisServiceCyclicDependence {
	
	@Autowired
	RedisConfig redisConfig;
	
	//导致循环依赖
	@Autowired
	JedisPool jedisPool;
	
	@Bean
	public JedisPool JedisPoolFactory() {
		JedisPoolConfig poolConfig = new JedisPoolConfig();
		poolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());
		poolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
		poolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);
		JedisPool jp = new JedisPool(poolConfig, redisConfig.getHost(), redisConfig.getPort(),
				redisConfig.getTimeout()*1000, redisConfig.getPassword(), 0);
		return jp;
	}

}

解决方法

  • 将配置JedisPool对象的类独立出来,不要在同一个类块中使用@Bean和@Autowried注解同一个对象,分为两个类进行配置,防止循环依赖。
@Service
public class RedisPoolFactory {

	@Autowired
	RedisConfig redisConfig;
	
	@Bean
	public JedisPool JedisPoolFactory() {
		JedisPoolConfig poolConfig = new JedisPoolConfig();
		poolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());
		poolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
		poolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);
		JedisPool jp = new JedisPool(poolConfig, redisConfig.getHost(), redisConfig.getPort(),
				redisConfig.getTimeout()*1000, redisConfig.getPassword(), 0);
		return jp;
	}
	
}
@Service
public class RedisService {
	
	@Autowired
	JedisPool jedisPool;
	
	//在使用jedisPool获取Jedis对象进行操作
}

总结:在进行注解操作的时候,不要随便使用注解,防止循环依赖出现

你可能感兴趣的:(Spring,redis)