Is it possible to Autowire two different beans of the same class without @qualifier and @resource? If yes, how?

Viewed 74

I have a component in jar fole which has a autowired DataSource

 @Service
 Class ReadService{
      @Autowire
       DataSource readDataSource
 }


@Service
 Class WriteService{
      @Autowire
      DataSource writeDataSource
 }

I have to configure two different severs, one to read and one to write.. how do I inject those DataSource to these beans created from Jar plugin...

2 Answers

You can read more here

in two words, you can specify different datasource configurations in properties file and create datasource beans separately

app.datasource.member.url=jdbc:mysql://localhost:3306/memberdb?createDatabaseIfNotExist=true
app.datasource.member.username=root
app.datasource.member.password=P@ssw0rd#
app.datasource.member.driverClassName=com.mysql.cj.jdbc.Driver
#card number  (cardholder id, cardnumber)
app.datasource.cardholder.url=jdbc:mysql://localhost:3306/cardholderdb?createDatabaseIfNotExist=true
app.datasource.cardholder.username=root
app.datasource.cardholder.password=P@ssw0rd#
app.datasource.cardholder.driverClassName=com.mysql.cj.jdbc.Driver
#expiration date (card id, expiration month, expiration year)
app.datasource.card.url=jdbc:mysql://localhost:3306/carddb?createDatabaseIfNotExist=true
app.datasource.card.username=root
app.datasource.card.password=P@ssw0rd#
app.datasource.card.driverClassName=com.mysql.cj.jdbc.Driver

For primary Datasource

@Bean
@Primary
@ConfigurationProperties("app.datasource.member")
public DataSourceProperties memberDataSourceProperties() {
    return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("app.datasource.member.configuration")
public DataSource memberDataSource() {
    return memberDataSourceProperties().initializeDataSourceBuilder()
            .type(HikariDataSource.class).build();

For secondary datasource

/*cardholder data source */
@Bean
@ConfigurationProperties("app.datasource.cardholder")
public DataSourceProperties cardHolderDataSourceProperties() {
    return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("app.datasource.cardholder.configuration")
public DataSource cardholderDataSource() {
    return cardHolderDataSourceProperties().initializeDataSourceBuilder()
            .type(BasicDataSource.class).build();
}
/*card data source*/
@Bean
@ConfigurationProperties("app.datasource.card")
public DataSourceProperties cardDataSourceProperties() {
    return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("app.datasource.card.configuration")
public DataSource cardDataSource() {
    return cardDataSourceProperties().initializeDataSourceBuilder()
            .type(BasicDataSource.class).build();
}

And specify schema in entity declaration

@Table(name = "member", schema = "memberdb")

If you build 2 separate applications based on same component, you can simply use different database connection settings in application.yml (or application.properties) of both applications

For "Write" app:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5433/writeDB
    username: "username"
    password: "password"

For "Read" app:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5433/readDB
    username: "username"
    password: "password"
Related