class ZookeeperAutoConfiguration {
    @Autowired
    private Environment environment;

    @Bean
    public ZookeeperOperation zookeeperOperation() {
        return new ZookeeperOperation();
    }

    @Bean
    @ConditionalOnMissingBean
    public CuratorFramework curatorFramework() {<FILL_FUNCTION_BODY>}
}

        String connectString = environment.getProperty(ZookeeperConstant.ZOOKEEPER_CONNECT_STRING);
        if (StringUtils.isEmpty(connectString)) {
            throw new DiscoveryException(ZookeeperConstant.ZOOKEEPER_CONNECT_STRING + " can't be null or empty");
        }

        int retryCount = environment.getProperty(ZookeeperConstant.ZOOKEEPER_RETRY_COUNT, Integer.class, ZookeeperConstant.ZOOKEEPER_DEFAULT_RETRY_COUNT_VALUE);
        int sleepTime = environment.getProperty(ZookeeperConstant.ZOOKEEPER_SLEEP_TIME, Integer.class, ZookeeperConstant.ZOOKEEPER_DEFAULT_SLEEP_TIME_VALUE);

        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(connectString).retryPolicy(new ExponentialBackoffRetry(sleepTime, retryCount)).build();
        curatorFramework.start();

        return curatorFramework;
    
<no_super_class>