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

+1 074новые вакансии за сутки·91 191вакансия открыта сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 172
  • Облачные технологии14 136
  • QA вакансии3 451
  • Backend вакансии2 051
  • Инженер данных1 762
  • Продакт-менеджер1 226

Разработка

  • Android1 854
  • iOS1 694
  • Fullstack вакансии978
  • AI вакансии944
  • Frontend вакансии735
  • Mobile вакансии43

По стеку

  • Go8 740
  • Java6 589
  • Node.js2 029
  • .NET1 734
  • Kotlin1 615
  • Rust1 473
  • C#715
  • PHP692
  • C++581

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

  • Kubernetes7 760
  • DevOps вакансии6 073
  • Linux-инфраструктура5 498
  • Terraform / IaC4 270
  • CI/CD3 273
  • Мониторинг и Observability1 791
  • SRE553
  • Кибербезопасность444

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

  • Data Scientist1 115
  • Бизнес-аналитик916
  • Аналитик данных832
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США42 450
  • Вакансии в Европе23 519
  • Вакансии в Канаде4 333
  • Работа в России3 786

По формату

  • Удалённые вакансии72 089
  • Релокация в США42 450
  • Гибридная работа12 458
  • Офисная работа7 066

По уровню

  • Senior вакансии41 491
  • Middle вакансии20 265
  • Junior вакансии6 499

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 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 его реализует?