class ZebraShardingConfigurationUtil {

    public static ZebraShardingConfiguration getZebraShardingConfiguration() {

        /*
         * 使用Spring Boot的Binder方式来读取，而不是常用的@ConfigurationProperties来自动装配。
         * 是因为ZebraShardingConfiguration会在实现了BeanDefinitionRegistryPostProcessor的类中使用
         * 此时@ConfigurationProperties注解的类还未被处理，对应的值皆为空。
         * 所以程序必须用Binder方式显式读取。
         */
        Environment environment = ApplicationContextUtil.getEnvironment();
        BindResult<ZebraShardingConfiguration> bindResult = Binder.get(environment)
                        .bind(ZEBRA_SHARDING_CONF_PREFIX, Bindable.of(ZebraShardingConfiguration.class));

        ZebraShardingConfiguration cfg = bindResult.isBound() ? bindResult.get() : null;

        if (cfg != null) {
            setType(cfg);
            setNameIfMasterSlave(cfg);
            fillDefaultCfgOfShardingIfNotCfg(cfg);
        }

        return cfg;
    }

    private  ZebraShardingConfigurationUtil();

}