SpringBoot注記サイクル依存
SpringBoot注記サイクル依存今日redisリンクプール構成コードが実行されたとき、テストを実行するときに循環依存の問題が発見されました.この記録には があります.
問題点同じクラスでredisリンクプールを構成していたため、 JedisPoolオブジェクトを構成するクラスを独立させ、同じクラスブロックで@Beanと@Autowriedを使用して同じオブジェクトを注釈しないで、2つのクラスに分けて構成し、ループ依存を防止します.
問題点
@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;
}
}
解決策@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
}
まとめ:注釈操作を行う場合、注釈を勝手に使用せず、ループ依存の出現を防止