Как настроить Spring-бины перед их инъекцией в Map?

«Как настроить Spring-бины перед их инъекцией в Map?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, Spring предоставляет несколько способов для настройки бинов до их инъекции в коллекцию Map.

1. Использование BeanPostProcessor

Позволяет перехватить и модифицировать любой бин до/после его инициализации.

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        if (bean instanceof MyService) {
            // Настройка бина перед init-методом
            ((MyService) bean).setCustomConfig("pre-init-value");
        }
        return bean;
    }
}

2. Аннотация @PostConstruct

Метод, аннотированный @PostConstruct, выполняется после инъекции зависимостей и перед тем, как бин будет готов.

@Component
public class MyService {
    private String config;

    @PostConstruct
    public void init() {
        this.config = "configured-value"; // Настройка перед использованием
    }
}

3. Ручная настройка в методе @Bean

При объявлении бина через @Bean в конфигурационном классе можно выполнить его настройку.

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        MyService service = new MyService();
        service.setCustomConfig("manual-config"); // Настройка
        return service;
    }
}

После настройки бины автоматически инжектируются в Map, где ключом является имя бина:

@Autowired
private Map<String, MyService> serviceMap; // Map содержит настроенные бины