Библиотека собеса по Java | вопросы с собеседований
6.47K subscribers
408 photos
9 videos
610 links
Вопросы с собеседований по Java и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/08c603b6

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что такое @Qualifier и когда его использовать?

@Qualifier используется для разрешения конфликтов при внедрении зависимостей, когда существует несколько бинов одного типа.

Без @Qualifier Spring не знает, какой бин внедрить, и выбросит NoUniqueBeanDefinitionException.

@Bean
@Qualifier("primary")
public DataSource primaryDB() { ... }

@Bean
@Qualifier("secondary")
public DataSource secondaryDB() { ... }

@Autowired
@Qualifier("primary")
private DataSource dataSource;


Альтернатива — использовать @Primary для бина по умолчанию.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4👏2
Что делает параметр readOnly = true у @Transactional?

readOnly = true — это подсказка для оптимизации, а не строгое ограничение.

Что происходит:

Hibernate может пропустить flush (не синхронизировать изменения с БД)
БД может оптимизировать запрос, не создавая блокировки
некоторые драйверы могут использовать read-only соединения

Важно: это не запрещает изменения программно. Можно вызвать save(), но изменения не гарантированно применятся. Это именно hint для оптимизации.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥21👏1
Что такое пропагация в транзакции?

Propagation определяет, как транзакция ведёт себя при вызове из другой транзакции.

Основные типы

— REQUIRED (default): использует текущую или создаёт новую
— REQUIRES_NEW: всегда создаёт новую, приостанавливая текущую
— MANDATORY: требует существующую, иначе исключение
— NEVER: требует отсутствие транзакции
— SUPPORTS: использует если есть, иначе работает без транзакции

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥1👏1
Зачем нужна аннотация @RestController?

@RestController — это специализированная версия @Controller для RESTful сервисов. Объединяет @Controller и @ResponseBody.

Без @RestController пришлось бы добавлять @ResponseBody к каждому методу. Результат методов автоматически конвертируется в JSON/XML через HttpMessageConverter.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91🔥1👏1
Опишите поведение аннотации @Autowired

@Autowired — это аннотация Spring Framework для автоматического внедрения зависимостей. Она может применяться к конструкторам, сеттерам, полям и методам.

Spring ищет подходящий бин в контексте по типу. Если находит один бин нужного типа — внедряет его. Если бинов несколько — выбрасывает исключение, если не указан квалификатор через @Qualifier. Если бин не найден — тоже выбрасывает исключение, если только не установлен параметр required = false.

Начиная с Spring 4.3, если у класса один конструктор, @Autowired можно опуститьSpring автоматически использует его для внедрения. Это считается хорошей практикой, так как делает код менее зависимым от фреймворка.

Порядок разрешения зависимостей: сначала по типу, потом по имени бина, если имя поля совпадает с именем бина. Для явного указания используют @Qualifier.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1👏1
Для чего аннотация @Cacheable в Spring?

@Cacheable кеширует результат метода. При повторном вызове с теми же параметрами метод не выполняется, возвращается закешированное значение.

Требует @EnableCaching. По умолчанию использует ConcurrentHashMap, но можно подключить Redis, Ehcache, Caffeine.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2👏1
Что такое Spring Boot Actuator?

Actuator предоставляет production-ready функции для мониторинга и управления приложением.

Эндпоинты:

/actuator/health — статус приложения
/actuator/metrics — метрики (память, потоки, HTTP запросы)
/actuator/env — переменные окружения
/actuator/loggers — управление уровнями логирования

Можно создавать кастомные эндпоинты. Важно: закрывайте чувствительные эндпоинты в production через Spring Security.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👏21🔥1
Что такое Spring Data JPA?

Spring Data JPA — это абстракция над JPA, упрощающая работу с базами данных.

Вместо написания DAO вручную, создаёте интерфейс, и Spring генерирует реализацию.

Поддерживает:

автогенерацию методов по naming convention
@Query для кастомных запросов
Paging и Sorting из коробки
Specification для динамических запросов

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👏2❤‍🔥11🔥1
Чем @Bean отличается от @Component в Spring?

▪️ @Component вешается над классомSpring сам создаёт его экземпляр через сканирование пакетов (@ComponentScan).

▪️ @Bean ставится над методом в @Configurationвы сами создаёте объект внутри метода и возвращаете его.

@Bean полезен, когда:

класс не ваш (нет доступа, чтобы добавить аннотацию)
нужен кастомный способ создания бина (например, с параметрами конструктора или фабричным методом)

Оба способа регистрируют бин в ApplicationContext, разница только в том, кто и как создаёт объект.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1👏1
Что такое Spring Bean Scope?

Spring Bean Scope определяет жизненный цикл и видимость бина в контейнере.

Основные виды:

▪️ singleton (по умолчанию) — один экземпляр на весь контейнер.
▪️ prototype — новый экземпляр при каждом запросе.
▪️ request — бин живёт в рамках HTTP-запроса.
▪️ session — бин живёт в рамках HTTP-сессии.
▪️ application — бин живёт в рамках веб-приложения.
▪️ websocket — бин на время WebSocket-сессии.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141🔥1
Что такое ApplicationContext в Spring?

ApplicationContext — это центральный интерфейс контейнера Spring, который загружает метаданные конфигурации из XML-файлов, Java-классов или аннотаций, создаёт бины и управляет ими на протяжении всего жизненного цикла приложения, а также предоставляет расширенные функции для разработки приложений.

Он является расширением BeanFactory и добавляет дополнительные возможности, такие как поддержка аннотаций, автоматическое связывание зависимостей, интернационализацию и публикацию событий.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1
Для чего нужен @Value в Spring?

@Value внедряет значения из property файлов или environment variables в поля, параметры методов или конструкторов.

@Value("${app.name}")
private String appName;

@Value("${app.timeout:30}")
private int timeout; // 30 - default значение

@Value("#{systemProperties['user.name']}")
private String userName; // SpEL выражение


Поддерживает

— property placeholders ${...}
— SpEL выражения #{...}
— значения по умолчанию через ":"

Альтернатива для группы свойств: @ConfigurationProperties.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71🔥1
Чем отличается @Transactional(propagation = REQUIRES_NEW) от NESTED?
И когда использование NESTED может неожиданно упасть?


REQUIRES_NEWполностью приостанавливает текущую транзакцию и открывает новую, независимую. Свой коннект к БД, свой коммит и роллбэк. Внешняя транзакция об этом не знает.

NESTED работает внутри той же транзакции через savepoint. Если вложенный метод откатится — откат только до savepoint'а, внешняя транзакция продолжает жить. Один коннект, один итоговый коммит.

⚠️ Когда NESTED неожиданно падает

1. JPA + Hibernate

JpaTransactionManager не поддерживает savepoints из коробки — получишь NestedTransactionNotSupportedException. Нужна явная донастройка, и то ненадёжно.

2. База не умеет savepoints

MySQL с движком MyISAM, некоторые конфигурации H2 — savepoints просто не поддерживаются на уровне драйвера.

3. Self-invocation

// proxy не задействован → NESTED полностью игнорируется
this.nestedMethod();


🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51🔥1
Что происходит с @Async методом, если он вызывается из того же класса?

Self-invocation убивает прокси

Spring создаёт AOP-прокси вокруг бина. Когда ты вызываешь this.sendEmail(), вызов идёт напрямую к объекту, минуя прокси. @Async не срабатывает, метод выполняется синхронно в том же потоке. Никакого исключения — просто тихий фейл.

private метод — та же история.

CGLIB-прокси не может переопределить private метод. Spring либо кидает предупреждение в лог, либо молча игнорирует аннотацию.

⚠️ Ещё один подводный камень

Исключения внутри @Async метода не пробрасываются к вызывающему коду. Если метод возвращает void, исключение просто теряется (уходит в AsyncUncaughtExceptionHandler). Если Future — исключение обёрнуто и бросится только при вызове get().

📌 Как правильно

Вынести @Async метод в отдельный бин и вызов пойдёт через прокси
Настроить AsyncUncaughtExceptionHandler для обработки ошибок
Возвращать CompletableFuture если нужно отслеживать результат

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83🔥1
Что такое N+1 проблема в Hibernate и чем JOIN FETCH отличается от @EntityGraph?

Загружаешь список из N сущностей, а потом для каждой Hibernate делает отдельный SELECT за связанной коллекцией. 1 запрос на список + N запросов на детали = катастрофа на проде.

// Загружаем 100 заказов — получаем 101 запрос
List<Order> orders = orderRepo.findAll();
orders.forEach(o -> o.getItems().size()); // LAZY — N запросов здесь


JOIN FETCH vs @EntityGraph

JOIN FETCH — пишешь в JPQL явно:
@Query("SELECT o FROM Order o JOIN FETCH o.items WHERE o.status = :s")
List<Order> findWithItems(@Param("s") Status s);

Гибко, но размножается: для каждой комбинации связей нужен свой метод.

@EntityGraph — декларативно, переиспользуемо:
@EntityGraph(attributePaths = {"items", "items.product"})
List<Order> findByStatus(Status status);


⚠️ Узкие места

JOIN FETCH с коллекциями если fetch двух коллекций одновременно → MultipleBagFetchException. Hibernate не умеет делать два JOIN FETCH на Bag-коллекции в одном запросе.

@EntityGraph → на больших данных легко получить декартово произведение в результирующем SQL и огромный набор дублирующихся строк. Используй DISTINCT или Set вместо List.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🔥1
Чем BeanFactory отличается от ApplicationContext?

BeanFactory — минималистичный IoC-контейнер. Умеет создавать бины и резолвить зависимости. Бины создаются лениво — только при первом getBean(). Используется в очень ресурсоограниченных средах (embedded-системы), в обычных Spring-приложениях практически не встречается.

ApplicationContext расширяет BeanFactory и добавляет всё, без чего реальное приложение не живёт: eager-инициализацию singleton'ов при старте, поддержку событий (ApplicationEvent), интернационализацию (MessageSource), lifecycle-коллбэки (@PostConstruct / @PreDestroy), AOP-интеграцию и работу с окружением (Environment / @Value).

⚠️ ApplicationContext создаёт все singleton-бины сразу при старте. Это значит: ошибки конфигурации (неверные зависимости, битые @Value) падают немедленно, а не при первом обращении к бину в рантайме.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1😁1
Для чего нужен @Conditional в Spring?

@Conditional регистрирует бин только при выполнении определённого условия.

@Bean
@Conditional(WindowsCondition.class)
public Service windowsService() {
return new WindowsService();
}

class WindowsCondition implements Condition {
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata) {
return System.getProperty("os.name")
.contains("Windows");
}
}


Spring Boot предоставляет готовые: @ConditionalOnProperty, @ConditionalOnClass, @ConditionalOnMissingBean.

🐸 Библиотека собеса по Java

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🔥1