/**
   * Create a new <code>GenericObjectPool</code> using a specific configuration.
   *
   * @param factory The object factory to be used to create object instances used by this pool
   * @param config The configuration to use for this pool instance. The configuration is used by
   *     value. Subsequent changes to the configuration object will not be reflected in the pool.
   */
  public GenericObjectPool(PooledObjectFactory<T> factory, GenericObjectPoolConfig config) {

    super(config, ONAME_BASE, config.getJmxNamePrefix());

    if (factory == null) {
      jmxUnregister(); // tidy up
      throw new IllegalArgumentException("factory may not be null");
    }
    this.factory = factory;

    idleObjects = new LinkedBlockingDeque<>(config.getFairness());

    setConfig(config);

    startEvictor(getTimeBetweenEvictionRunsMillis());
  }
 /**
  * Sets the base pool configuration.
  *
  * @param conf the new configuration to use. This is used by value.
  * @see GenericObjectPoolConfig
  */
 public void setConfig(GenericObjectPoolConfig conf) {
   setLifo(conf.getLifo());
   setMaxIdle(conf.getMaxIdle());
   setMinIdle(conf.getMinIdle());
   setMaxTotal(conf.getMaxTotal());
   setMaxWaitMillis(conf.getMaxWaitMillis());
   setBlockWhenExhausted(conf.getBlockWhenExhausted());
   setTestOnCreate(conf.getTestOnCreate());
   setTestOnBorrow(conf.getTestOnBorrow());
   setTestOnReturn(conf.getTestOnReturn());
   setTestWhileIdle(conf.getTestWhileIdle());
   setNumTestsPerEvictionRun(conf.getNumTestsPerEvictionRun());
   setMinEvictableIdleTimeMillis(conf.getMinEvictableIdleTimeMillis());
   setTimeBetweenEvictionRunsMillis(conf.getTimeBetweenEvictionRunsMillis());
   setSoftMinEvictableIdleTimeMillis(conf.getSoftMinEvictableIdleTimeMillis());
   setEvictionPolicyClassName(conf.getEvictionPolicyClassName());
 }