I recently had to do something similar and the way I did it was by using BeanDefinitionRegistryPostProcessor. I used jdbcTemplates but it should be transferable to hibernate sessions aswel. Doing it this was I was able to add any amount of databases and the beans would get created. then just add the beans in the context file.
What I did was in the config
@Valid
@NotNull
@JsonProperty("database")
private Collection<DataSourceConfig> databases;
public Collection<DataSourceConfig> getDatabase() {
return databases;
}
This is my DataSourceConfig class
public class DataSourceConfig {
@JsonProperty
private String name;
@JsonProperty
private String driverClassName;
@JsonProperty
private String username;
@JsonProperty
private String password;
@JsonProperty
private String url;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
This is the method from my class that implements BeanDefinitionPostProcessor
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
/**
* Builds JdbcTemplates for beans
*/
Map<String,String> jdbcTemplateBeanNames = Maps.newHashMap();
for (DataSourceConfig dsc : configuration.getDatabase()) {
AbstractBeanDefinition jdbcTemplateDefinition = BeanDefinitionBuilder.rootBeanDefinition("org.springframework.jdbc.core.JdbcTemplate")
.addPropertyValue("dataSource",
BeanDefinitionBuilder.genericBeanDefinition(DriverManagerDataSource.class)
.addPropertyValue("driverClassName", dsc.getDriverClassName())
.addPropertyValue("url", dsc.getUrl())
.addPropertyValue("username", dsc.getUsername())
.addPropertyValue("password", dsc.getPassword())
.getBeanDefinition()
)
.getBeanDefinition();
String name = BeanDefinitionReaderUtils.registerWithGeneratedName(jdbcTemplateDefinition, registry);
jdbcTemplateBeanNames.put(dsc.getName(), name);
}