Skip to content

Provide an easy way to duplicate service AutoConfiguration #35157

Closed as not planned
@quaff

Description

@quaff

It is higher level abstraction of #27834

Currently It's a bit hard to add extra service without back off default one, especially for RedisAutoConfiguration.

Requirement:

  1. keep default service AutoConfiguration in use
  2. duplicate default service with a prefix applied to beanName, configuration properties can be overriden if prefixed configuration key exists
  3. mark default service bean as primary (OPTIONAL)

Possible solution:

Provide a dedicated BeanDefinitionRegistryPostProcessor to duplicate

@RequiredArgsConstructor
public class AutoConfigurationDuplicator implements BeanDefinitionRegistryPostProcessor {

	private final Class<?> autoConfigurationClass;

	private final String prefix;

	private final boolean markDefaultAsPrimary;

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

	}

	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		// TODO duplicate all BeanDefinitions belong to autoConfigurationClass with
		// prefix, mark default BeanDefinitions as primary if markDefaultAsPrimary is true
	}

}

then duplicate service in application configuration

@Configuration
public class MyConfiguration {

	@Autowired
	@Qualifier("anotherStringRedisTemplate") // anotherStringRedisTemplate is available now
	private StringRedisTemplate anotherStringRedisTemplate; 

	@Bean
	static AutoConfigurationDuplicator anotherRedisConfiguration() {
		return new AutoConfigurationDuplicator(RedisAutoConfiguration.class, "another", false);
	}

}
spring.data.redis:
  host: redis.svc.default.cluster.local
  database: 1

another.spring.data.redis:
#  host: redis.svc.default.cluster.local default to spring.data.redis
  database: 2

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions