2017-02-18 30 views
1

Я искал это некоторое время.@Conditional при инициализации боба

До сих пор я нашел this блог очень полезный, но не решил мою проблему.

Я хочу @Autowired боб только если flag верно, то я хочу, чтобы быть null

Use Case:

Если один из БД находится на обслуживании, я не хочу мое приложение терпит неудачу.

@Bean("sqlDatabase") 
public Database getSqlDatabase(@Value("${datasource.sql.url}") String url, 
     @Value("${datasource.sql.username}") String username, @Value("${datasource.sql.password}") String password, 
     @Value("${datasource.poolsize.min}") int minPoolSize, @Value("${datasource.poolsize.max}") int maxPoolSize, 
     @Value("${database.enable-sql}") boolean isSqlEnabled) { 
    if (isSqlEnabled) 
     return Database.builder().url(url).pool(minPoolSize, maxPoolSize).username(username).password(password) 
       .build(); 
    else 
     return null; 
} 

Теперь, в этом случае, его бросали ошибки, как я не могу autowirenull боб.

Я хотел использовать @Conditional, но мой случай немного сложный. Мне нужно, чтобы все 3 базы данных обновлялись. Я просто хочу, чтобы skip один из них, если условия не выполнены.

+0

* Мне уже нужны все 3 базы данных для обновления. Я просто хочу пропустить один из них, если условия не выполняются. *. Можете ли вы подробнее рассказать о том, что вы подразумеваете под этим? – CKing

+0

У меня есть приложение для загрузки весны, которое касается 3 баз данных. Я создаю для них 3 разных компонента. теперь позволяет говорить об обслуживании, мы хотим отключить один бит, мне все равно нужно отдохнуть 2. В примере в блоге. Это 'EITHER-OR', что действительно не применимо в моем случае. Я просто не хочу, чтобы моя инициализация зависала с таймаутами, которые пытались подключиться. –

ответ

1

Вы можете использовать профили. один профиль для каждой базы данных

  • DB1
  • db2
  • db3

Чем аннотировать класс компонента или метод компонента с профилем, который должен быть активирован, чтобы использовать этот компонент как

@Profile("db1") 
@Bean("db1") 
public Database getSqlDatabase(...){...}  

Когда вы запускаете приложение, bean, аннотированный с помощью @Profile, будет только cr если активируется соответствующий профиль.

Вы активируете профиль, установив свойство «spring.profiles.active». Для активации DB1 и DB2:

spring.profiles.active=db1,db3 

Вы можете установить это свойство в файл свойств или в качестве параметра командной строки.

Профили дают вам большую гибкость, чтобы изменить вам контекст пружинной конфигурацией

  • вы можете аннотировать много бобов с тем же профилем
  • вы можете аннотировать класс конфигурации с профилем
  • вы можете используйте файлы свойств профиля профиля
  • вы можете использовать множество профилей в одном аннотации @Profile.Логический «или» будет использоваться, поэтому bean, аннотированный с помощью @Profile («db1», «db2»), будет создан, если активен профиль «db1» или активен профиль «db2»
    • если вы хотите что-то иначе, чем «или» вы можете использовать @Conditional определить собственную логику

Пожалуйста, обратите внимание: Если вы используете не использовать сканирование компонентов или конфигурации XML, аннотации @Profile в классе компонента не имеет эффект. Вам нужно будет аннотировать метод bean с помощью @Profile или всего класса конфигурации.

+0

Что происходит, когда у меня есть аннотированные поля? будет ли оно нулевым, если оно не удовлетворяет профилю? –

+0

, как я подозревал, он автоматически очищает bean как «null». Именно то, что мне нужно! Я могу справиться с остальными. Большое спасибо. Я вводил в заблуждение много вещей излишне. :) –