Как я могу создать «управляемый Spring» StatementInspector, чтобы включить определенные функции Springboot, такие как классы Autowiring и ссылки на свойства Spring через @Value в классе StatementInspector.
Текущий метод, который я использую для регистрации StatementInspector через свойство конфигурации (ниже), не позволяет использовать эти функции Spring.
spring:
jpa:
properties:
hibernate:
session_factory:
statement_inspector: x.x.SqlStatementInspector
Возможное решение:
@Bean
public HibernatePropertiesCustomizer hibernateCustomizer(StatementInspector statementInspector) {
return (properties) -> properties.put(AvailableSettings.STATEMENT_INSPECTOR, statementInspector);
}
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
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
@ConditionalOnMissingBean(StatementInspector.class)
public StatementInspector emptyInspector() {
return EmptyStatementInspector.INSTANCE;
}
примечание: нет необходимости устанавливать spring.jpa.properties.hibernate.session_factory.statement_inspector
@dekkard Хорошая мысль! В качестве альтернативы можно использовать @ConditionalOnProperty(.... matchIfMissing=true) на одном из предоставленных StatementInspector.
Это умное решение. Следует отметить, что должен быть запасной вариант на случай, если свойство не установлено. Например.
@Bean @ConditionalOnMissingBean(StatementInspector.class) public StatementInspector emptyInspector() { return EmptyStatementInspector.INSTANCE; }