package locksdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @EnableAutoConfiguration @EnableDiscoveryClient public class LocksApplication extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(LocksApplication.class, args); } @Bean public LocksController locksController(LockService lockService) { return new LocksController(lockService); } @ConditionalOnClass(RedisConnectionFactory.class) @ConditionalOnBean(RedisConnectionFactory.class) @Configuration protected static class RedisLockServiceConfiguration { @Bean @ConditionalOnMissingBean(LockService.class) public RedisLockService lockService(RedisConnectionFactory connectionFactory) { return new RedisLockService(connectionFactory); } } @ConditionalOnClass(RedisConnectionFactory.class) @ConditionalOnMissingBean(RedisConnectionFactory.class) @Configuration protected static class FallbackSimpleLockServiceConfiguration { @Bean @ConditionalOnMissingBean(LockService.class) public SimpleLockService lockService() { return new SimpleLockService(); } } @ConditionalOnMissingClass(name="org.springframework.data.redis.connection.RedisConnectionFactory") @Configuration protected static class SimpleLockServiceConfiguration { @Bean @ConditionalOnMissingBean(LockService.class) public SimpleLockService lockService() { return new SimpleLockService(); } } }