Spring Tip: Customizer интерфейсы для кастомизации бинов



Одной из главных причин популярности Spring Boot является его способность автоматически конфигурировать (auto-configuration) множество компонентов, существенно упрощая жизнь разработчикам. Однако иногда возникает необходимость слегка подправить настройки этих компонентов без отказа от всех преимуществ автоматической конфигурации.



Предположим, вам нужно кастомизировать настройки кэша в вашем приложении. Вместо того чтобы полностью переопределять CacheManager, вы можете использовать Customizer интерфейс, чтобы внести необходимые изменения:





@Bean

CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {

return cacheManager -> cacheManager.setAllowNullValues(false);

}





Аналогичным образом можно настроить и любые другие компоненты:





//Кастомизация свойств Hibernate

@Bean

HibernatePropertiesCustomizer hibernatePropertiesCustomizer() {

return properties -> properties.put("hibernate.integrator_provider",

(IntegratorProvider) () -> List.of(new BeanValidationIntegrator()));

}



//Кастомизация Jackson2ObjectMapperBuilderCustomizer

@Bean

Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {

return builder -> {

builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);

builder.featuresToEnable(

SerializationFeature.WRITE_ENUMS_USING_TO_STRING,

DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

};

}





Но бывает и такое, что подходящего Customizer интерфейса просто нет. В таком случае, можно использовать BeanPostProcessor для кастомизации уже инициализированных бинов:





//Кастомизация springLiquibase бина

@Bean

BeanPostProcessor liquibaseBeanPostProcessor() {

return new BeanPostProcessor() {

@Override

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

if (bean instanceof SpringLiquibase springLiquibase) {

springLiquibase.setContexts("my-context");

}

return bean;

}

};

}





#SpringBoot #SpringTips