Stepan Koltsov opened SPR-14103 and commented

Requesting a

@Configuration(prefix = "aabb-")

attribute. When prefix is specified, it is prepended to names of all beans defined in that @Configuration.

Why is it important: to create reusable configurations. For example, one might have database connection component which comprises of: DataSource, DataSourceMonitoring, ThreadPool etc.

It could be written like this:

abstract class DbContextTemplate {
    abstract String dbHost();

    @Bean DataSource dataSource() {
        return new DataSourceImpl(dbHost);
    }

    @Bean DataSourceMonitoring dataSourceMonitoring() {
        return new DataSourceMonitoring(dataSource());
    }

    ... ten more bean definitions
}

@Configuration(prefix = "primary-")
class PrimaryDbContext extends DbContextTemplate {
    String dbHost() { return "primary.host"; }
}

@Configuration(prefix = "another-")
class AnotherDbContext extends DbContextTemplate {
    String dbHost() { return "secondary"; }
}

With "prefix" attribute these configurations emit beans with names "primary-dataSource", "primary-dataSourceMonitoring", "another-dataSource", "another-dataSourceMonitoring".

However, currently Spring has no anything like "prefix" attribute, so this configuration is not possible, since generated bean names for "dataSource" would be the same for both subclass configurations.

Generally, it is not currently possible in Spring to create reusable configurations (configurations which could be used more than once in the application context). It would be good to have it in large applications.


Affects: 4.2.5

Reference URL: http://stackoverflow.com/questions/36298227/spring-how-to-reuse-the-same-configuration-multiple-times

Issue Links: - #18794 @Configuration interface with Java 8 default methods (as a standalone artifact)

4 votes, 5 watchers

Comment From: spring-projects-issues

Juergen Hoeller commented

Stéphane Nicoll, Brian Clozel, Phil Webb, any opinions on this one? Do you see such prefixed naming per configuration class as useful within a Boot environment, and would you expose it as a prefix attribute at the @Configuration level or rather some other way?

Comment From: spring-projects-issues

Phil Webb commented

I don't see it being particularly useful for Boot users. Personally I think it's a little confusing to add it as a feature to @Configuration, it's not immediately clear that prefix changes names of @Bean methods. It's a little more work, but I think the existing ImportBeanDefinitionRegistrar interface works quite well for this kind of thing:

@EnableDatabase("primary")
@EnableDatabase("another")
@Configuration
public class MyConfiguration {
}

The prefix is only really useful if you have configuration you want to reuse and it defines more than one bean.

Comment From: spring-projects-issues

Juergen Hoeller commented

Alright, since we're time-bound for 5.0 now, let's move this to the backlog for further votes and further feedback.

Comment From: bclozel

Closing for lack of demand and because in general we don't feel this is the right approach to apply a namespace to beans in an application. This also brings a lot of questions on conditions, imports and other interactions with the general configuration model.