Springboot手動でredisプロファイルをロードする


シーン:
問題のようにspringbootはプロファイルのロードファイルを手動でロードし、本プロジェクトのredisモジュールは別のプロジェクトからロードされ、別のプロジェクトで使用されます.

		
			com.xiaoleilu
			hutool-all
			3.3.0
		
com.xiaoleilu.hutool.db.nosql.redis.RedisDS    ,              ,           jar ,               

redis構成
redis構成は、プロファイル内のアプリケーション-x.ymlにあります.
spring:
  redis:
    host: localhost
    port: 6379
    password: cloud     #   
    timeout: 6000    #       (  )

    jedis.pool:
      #jedis      
      maxTotal: 1024
      #jedis    idel     
      maxIdle: 200
      #jedis        ,      
      maxWaitMillis: 10000
      testOnBorrow: true
      testOnReturn: true
      blockWhenExhausted: false
      #Idle       
      testWhileIdle: true
      #  idle object evitor       sleep    
      timeBetweenEvictionRunsMillis: 30000
      #  idle object evitor           
      numTestsPerEvictionRun: 10
      #           idle       ,     idle object evitor     ;      timeBetweenEvictionRunsMillis  0     
      minEvictableIdleTimeMillis: 60000

redis構成クラスの読み込み


import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.env.PropertySourcesLoader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.ClassPathResource;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.util.LinkedHashMap;

/**
 * 
 *
 *    redis   ,        bean   
 *
 */
@Configuration
public class Config {

    Logger logger = Logger.getLogger(this.getClass());

    /**
     *             
     */
    @Value("${spring.profiles.active}")
    private String active;


    /**
     * @ConditionalOnMissingBean
     *             
     * @return
     */
    @ConditionalOnMissingBean
    @Bean
    public JedisPool jedisPool (JedisPoolConfig config,PropertySource> source) {
        if(null != source) {
            LinkedHashMap sourceMap = source.getSource();

            JedisPool pool = new JedisPool(config, (String) sourceMap.get("spring.redis.host"),(Integer) sourceMap.get("spring.redis.port"),
                    (Integer) sourceMap.get("spring.redis.timeout"),(String) sourceMap.get("spring.redis.password"));
            return pool;
        }
        //       ,              
        logger.error("       JedisPool   ,        JedisPool");
        //        localhost       6379
        return new JedisPool();
    }



    @Bean
    public JedisPoolConfig jedisConfig(PropertySource> source){
        if(null != source ) {
            LinkedHashMap sourceMap = source.getSource();

            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle((Integer) sourceMap.get("spring.redis.jedis.pool.maxIdle"));
            config.setMaxTotal((Integer)sourceMap.get("spring.redis.jedis.pool.maxTotal"));
            config.setMaxWaitMillis(Long.valueOf(sourceMap.get("spring.redis.jedis.pool.maxWaitMillis").toString()));
            config.setTestOnBorrow((Boolean)sourceMap.get("spring.redis.jedis.pool.testOnBorrow"));
            config.setTestOnReturn((Boolean)sourceMap.get("spring.redis.jedis.pool.testOnReturn"));
            config.setBlockWhenExhausted((Boolean)sourceMap.get("spring.redis.jedis.pool.blockWhenExhausted"));
            config.setTestWhileIdle((Boolean)sourceMap.get("spring.redis.jedis.pool.testWhileIdle"));
            config.setTimeBetweenEvictionRunsMillis(Long.valueOf(sourceMap.get("spring.redis.jedis.pool.timeBetweenEvictionRunsMillis").toString()));
            config.setNumTestsPerEvictionRun((Integer)sourceMap.get("spring.redis.jedis.pool.timeBetweenEvictionRunsMillis"));
            config.setMinEvictableIdleTimeMillis(Long.valueOf(sourceMap.get("spring.redis.jedis.pool.minEvictableIdleTimeMillis").toString()));
            return config;
        }
        //       
        logger.error("   JedisPoolConfig   ");
        return new JedisPoolConfig();

    }


    /**
     *       
     */
    @Bean
    public PropertySource> readProperties(){
        String yml = "application-" + active +".yml";
        ClassPathResource resource = new ClassPathResource(yml);
        PropertySourcesLoader loader = new PropertySourcesLoader();
        PropertySource> load;
        try {
            load = (PropertySource>) loader.load(resource);
            return load;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }




}

JedisPoolをゲット
JedisPoolによって具体的な接続が得られ、これまで様々な操作が行われてきた.
@Component("RedisService")
public class RedisService {

  

    /**
     *    
     */
    @Autowired
    private static JedisPool jedisPool;

    /**
     * JedisPool    
     */
    @Autowired
    public  void setJedisPool(JedisPool jedisPool) {
        RedisService.jedisPool = jedisPool;
    }

   

// ...     redis    

}

次の手順に従います.
実はそんなに考えていません.このredisServiceクラスにjedisPoolが必要である以上、@Bean方式でnewを出して、半日springbootを探して読みました.ymlファイルのツールクラス、springbootに付属のツールクラスがあることを発見しました
YamlPropertySourceLoader           ,       ,     ,               
PropertySourcesLoader ,       ,                

その後springbootには独自のredis読み出し構成クラスがあり、RedisProperties