Управляемый Spring StatementInspector

Как я могу создать «управляемый Spring» StatementInspector, чтобы включить определенные функции Springboot, такие как классы Autowiring и ссылки на свойства Spring через @Value в классе StatementInspector.

Текущий метод, который я использую для регистрации StatementInspector через свойство конфигурации (ниже), не позволяет использовать эти функции Spring.

spring:
 jpa:
  properties:
   hibernate:
    session_factory:
      statement_inspector: x.x.SqlStatementInspector
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможное решение:

  1. Настройте HibernatePropertiesCustomizer-bean
@Bean
public HibernatePropertiesCustomizer hibernateCustomizer(StatementInspector statementInspector) {
    return (properties) -> properties.put(AvailableSettings.STATEMENT_INSPECTOR, statementInspector);
}
  1. Предоставьте условныйStatementInspector-бин на основе значения свойства.

пример: OneStatementInspector создается, только если значение demo.statement_spawn равно единице.

@Component
@ConditionalOnProperty(prefix = "demo", name  = "statement_inspector", havingValue = "one" )
public class OneStatementInspector implements StatementInspector {
    
   @Value("${demo.my-value}") String myValue; 

    @Override
    public String inspect(String s) {
        // myValue is available here
        ...
    }

}

приложение.свойства

demo.my-value=my autowired value
demo.statement_inspector = one
  1. Если конфигурация StatementInspector необязательна ( demo.statement_инспекция не обязательна), есть несколько вариантов:
  • Сделайте один из возможных StatementInspector значением по умолчанию (соответствуйте, если свойство отсутствует) @ConditionalOnProperty(prefix = "demo", name = "statement_inspector", havingValue = "...", matchIfMissing = true )

  • Сделайте HibernatePropertiesCustomizer-bean необязательным:

@Bean
@ConditionalOnProperty("demo.statement_inspector")
public HibernatePropertiesCustomizer hibernateCustomizer(StatementInspector statementInspector) {
    ...
}
  • Укажите bean-компонент по умолчанию, как предлагает @dekkard:
@Bean   
@ConditionalOnMissingBean(StatementInspector.class)     
public StatementInspector emptyInspector() {        
  return EmptyStatementInspector.INSTANCE;  
}

примечание: нет необходимости устанавливать spring.jpa.properties.hibernate.session_factory.statement_inspector

Это умное решение. Следует отметить, что должен быть запасной вариант на случай, если свойство не установлено. Например. @Bean @ConditionalOnMissingBean(StatementInspector.class) public StatementInspector emptyInspector() { return EmptyStatementInspector.INSTANCE; }

dekkard 15.02.2023 13:02

@dekkard Хорошая мысль! В качестве альтернативы можно использовать @ConditionalOnProperty(.... matchIfMissing=true) на одном из предоставленных StatementInspector.

Dirk Deyne 15.02.2023 16:14

Другие вопросы по теме

Похожие вопросы