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对象进行操作
}
总结:在进行注解操作的时候,不要随便使用注解,防止循环依赖出现