SpringBoot注記サイクル依存

8527 ワード

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を使用して同じオブジェクトを注釈しないで、2つのクラスに分けて構成し、ループ依存を防止します.
  • @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      
    }
    
    まとめ:注釈操作を行う場合、注釈を勝手に使用せず、ループ依存の出現を防止