Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+687новых вакансий за сутки·55 254вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 791
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

DevOps и инфраструктура

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

Аналитика и данные

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

Другие направления

  • Проджект-менеджер119
  • UI/UX дизайн72
  • Ручное тестирование14

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Spring FrameworkВсе вопросы
Spring FrameworkSeniorТеория

Что такое BeanPostProcessor и BeanFactoryPostProcessor и чем они отличаются?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

BeanFactoryPostProcessor изменяет BeanDefinition-метаданные до создания бинов (например, PropertySourcesPlaceholderConfigurer). BeanPostProcessor оборачивает или заменяет готовые экземпляры до/после инициализации — здесь Spring AOP создаёт CGLIB/JDK-прокси для @Transactional и @Cacheable.

Интерфейсы

// Изменяет метаданные — работает ДО создания бинов
@FunctionalInterface
public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
            throws BeansException;
}

// Оборачивает/заменяет экземпляры — работает ПОСЛЕ создания каждого бина
public interface BeanPostProcessor {
    default Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean;
    }
    default Object postProcessAfterInitialization(Object bean, String beanName) {
        return bean;
    }
}

BeanFactoryPostProcessor и BeanPostProcessor

Это два разных extension point контейнера Spring, работающих на разных уровнях и в разное время жизненного цикла.

  • BeanFactoryPostProcessor — вызывается после загрузки всех BeanDefinition, но до создания любого бина. Позволяет изменять метаданные бинов (BeanDefinition): scope, class, свойства. Типичный пример — PropertySourcesPlaceholderConfigurer, который подставляет ${db.url} до того, как создан хоть один бин.
  • BeanPostProcessor — вызывается дважды вокруг инициализации каждого созданного бина: до и после @PostConstruct/afterPropertiesSet(). Позволяет заменять или оборачивать экземпляры. Именно здесь AnnotationAwareAspectJAutoProxyCreator создаёт AOP-прокси.

Пример: BeanFactoryPostProcessor — принудительный scope

@Component
public class ForceScopePostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) {
        // Меняем scope бина на prototype до его создания
        BeanDefinition def = factory.getBeanDefinition("paymentService");
        def.setScope(BeanDefinition.SCOPE_PROTOTYPE);

        // Подсмотреть все бины определённого типа
        String[] names = factory.getBeanNamesForType(DataSource.class);
        for (String name : names) {
            BeanDefinition bd = factory.getBeanDefinition(name);
            System.out.println(name + " -> " + bd.getBeanClassName());
        }
    }
}

Пример: BeanPostProcessor — кастомная аннотация

// Аннотация для логирования времени выполнения методов
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Timed {}

@Component
public class TimedBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if (bean.getClass().isAnnotationPresent(Timed.class)) {
            // Создаём JDK Dynamic Proxy
            return Proxy.newProxyInstance(
                bean.getClass().getClassLoader(),
                bean.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    long start = System.nanoTime();
                    try {
                        return method.invoke(bean, args);
                    } finally {
                        long elapsed = System.nanoTime() - start;
                        System.out.printf("%s.%s took %d ms%n",
                            beanName, method.getName(), elapsed / 1_000_000);
                    }
                }
            );
        }
        return bean;
    }
}

@Timed
@Service
public class OrderService implements OrderServiceI {
    public void processOrder(Long id) { /* ... */ }
}

Встроенные реализации в Spring

  • PropertySourcesPlaceholderConfigurer — BeanFactoryPostProcessor, резолвит ${...} плейсхолдеры.
  • ConfigurationClassPostProcessor — BeanFactoryPostProcessor, обрабатывает @Configuration, @Bean, @Import.
  • AutowiredAnnotationBeanPostProcessor — BeanPostProcessor, обрабатывает @Autowired и @Value.
  • CommonAnnotationBeanPostProcessor — BeanPostProcessor, обрабатывает @PostConstruct, @PreDestroy, @Resource.
  • AnnotationAwareAspectJAutoProxyCreator — BeanPostProcessor, создаёт AOP-прокси для @Transactional, @Cacheable и т.д.

Подводные камни

  • BeanFactoryPostProcessor нельзя инжектировать в него зависимости через @Autowired — он создаётся раньше всех остальных бинов, и обычные бины ещё не существуют.
  • Если BeanPostProcessor зависит от обычного бина (@Autowired SomeService), Spring предупредит, что этот бин «not eligible for auto-proxying» — BeanPostProcessor-ы создаются до AOP-прокси.
  • Если postProcessAfterInitialization вернул другой объект (прокси), то тип прокси должен совпадать с типом, ожидаемым при инжекции — иначе ClassCastException при getBean().
  • Метод postProcessBeforeInitialization, вернувший null, остановит цепочку обработки — Spring выбросит исключение. Всегда возвращайте ненулевое значение.
  • Порядок выполнения нескольких BeanPostProcessor-ов управляется через интерфейс Ordered или аннотацию @Order.
  • BeanFactoryPostProcessor работает только с singleton и prototype бинами из основного контекста — бины web-scope (request, session) на этом этапе ещё не зарегистрированы.
  • Не нужно вручную регистрировать BeanPostProcessor в ApplicationContext — контейнер автоматически обнаруживает все бины, реализующие этот интерфейс. В bare BeanFactory нужна ручная регистрация.
  • Изменение BeanDefinition внутри BeanPostProcessor (а не BeanFactoryPostProcessor) — антипаттерн: бин уже создан, изменять его метаданные поздно и небезопасно.

Типичные ошибки

  • Путать термин «bean post processors» с соседним механизмом Spring Framework.
  • Не называть границу lifecycle, transaction, thread или request для «bean post processors».
  • Игнорировать production-эффекты «bean post processors»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «bean post processors» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «bean post processors».
  • Уточнить, какие настройки или API меняют «bean post processors» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Spring Framework →

Источники

  • https://docs.spring.io/spring-framework/reference/core/beans/introduction.html
←Предыдущий вопросКакие scopes бинов существуют в Spring? Объясните singleton, prototype, request и session.Следующий вопрос→В чём разница между `@Bean` и `@Component`?

Связанные темы

Spring Frameworkbackend-designtechnical-communication

Частые вопросы на собеседовании

  • Что такое Spring Framework и какие проблемы он решает?
  • Что такое Spring Bean? Как IoC-контейнер Spring управляет бинами?
  • Что такое Spring MVC? Объясните жизненный цикл запроса в DispatcherServlet.
  • Что такое Inversion of Control (IoC) и как Spring его реализует?