Настройка загрузки Spring для нескольких СУБД и нескольких профилей

Я новичок в Spring Boot и не знаю, возможно ли то, что я хочу сделать, но мне нужно решить следующую проблему.

1 - У меня есть API с Spring Boot, и мне нужно настроить две СУБД (MySQL и Postgres).

2 - Для каждой СУБД мне нужно настроить разные профили. (Dev, Prod)

Следуйте моим классам конфигурации MySQL:

@Component
@Profile("mysql")
public class ConfigMySQL {

    public ConfigMySQL() {
        System.out.println("BD MySQL");
    }
}


@Component
@Profile("dev")
public class ConfigDevMySQL extends ConfigMySQL {

    public ConfigDevMySQL() {
        System.out.println("\n\n");
        System.out.println(" ****** Configuration dev MySQL... ******");
        System.out.println("\n\n");
    }
}


@Component
@Profile("prod")
public class ConfigProdMySQL extends ConfigMySQL{

    public ConfigProdMySQL() {
        System.out.println("\n\n");
        System.out.println(" ****** Configuration prod MySQL... ******");
        System.out.println("\n\n");
    }
}

Следуйте моим классам конфигурации Postgres:

@Component
@Profile("postgres")
public class ConfigPostgres {

    public ConfigPostgres() {
        System.out.println("DB postgres");
    }
}


@Component
@Profile("dev")
public class ConfigDevPostgres extends ConfigPostgres{

    public ConfigDevPostgres() {
        System.out.println("\n\n");
        System.out.println(" ****** Configuration dev Postgres... ******");
        System.out.println("\n\n");
    }
}


@Component
@Profile("prod")
public class ConfigProdPostgres extends ConfigPostgres {

    public ConfigProdPostgres() {
        System.out.println("\n\n");
        System.out.println(" ****** Configuration prod Postgres... ******");
        System.out.println("\n\n");
    }
}

мой файл профиля выглядит так:

Примечание. Я почти уверен, что он ошибается, но, например, я оставил это таким.

spring.profiles.active=mysql
spring.profiles.active=dev 

Всегда помните, что это единый API с двумя СУБД и разными профилями.

Когда я запускаю свое приложение, у меня появляется этот вывод на консоли

 BD MySQL

 ****** Configuration dev MySQL... ******



DB postgres

 ****** Configuration dev Postgres... ******

Я ожидал, что мой выход будет:

DB MySQL

 ****** Configuration dev MySQL... ******

Важно:

Когда я настраиваю профиль для подключения к моей базе данных MySQL Dev, я хочу подключиться только к ней. И я хочу того же результата, когда он лежит в основе Prod MySQL.

Это также относится к Postgres.

Когда я настраиваю профиль для подключения к моей базе данных Postgres Dev, я хочу подключаться только к ней. И я хочу того же результата, когда он лежит в основе Prod Postgres.

Я действительно не знаю, возможно ли это, и даже не знаю, как это сделать!

Кто-нибудь знает, как это сделать, и не могли бы вы мне помочь?

Благодарю за внимание.


person Mik3i4a5    schedule 01.06.2020    source источник


Ответы (1)


Вместо того, чтобы иметь несколько компонентов Spring с аннотацией @Profile, вы можете использовать классы конфигурации с @Profile(db_name), а затем иметь активацию профиля для конкретной среды в этих классах. Например, для профиля MySQL:

    @Configuration
    @Profile("mysql")
    public class MySqlConfiguration{

        public MySqlConfiguration() {
            System.out.println("BD MySQL");
        }

        @Bean
        @Profile("dev") 
        public ConfigDevMySQL() {
            return new ConfigDevMySQL();
        } 

        @Bean
        @Profile("prod") 
        public ConfigProdMySQL () {
            return new ConfigProdMySQL();
        } 
    }

Это должно означать, что классы конфигурации читаются только тогда, когда установлен соответствующий профиль БД, а последующие Бины создаются только тогда, когда установлен соответствующий профиль среды.

Вы также должны удалить аннотацию @Component из ваших текущих классов - ConfigProdMySQL и т. Д. - и создать их вручную в классах конфигурации.

person Matt Watson    schedule 02.06.2020
comment
Спасибо за ответ, это мне очень помогло !! - person Mik3i4a5; 02.06.2020