Встречается на собеседованиях • сегодня

Как связаны Self-Injection и Spring AOP

Self-Injection в Spring — это ситуация, когда бин внедряет сам себя (например, через @Autowired). Это может понадобиться для использования Spring AOP, так как проксирование работает только через вызовы методов бина извне.

Пример:

java
@Service
public class MyService {
    @Autowired
    private MyService self; // Self-Injection
text
@Transactional
public void outer() {
    self.inner(); // Без self вызов inner() не будет проксирован!
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void inner() {
    // Логика
}

}

text

**Почему так?**  
Spring AOP использует прокси-объекты. При вызове `inner()` напрямую (без `self`) метод выполняется в оригинальном объекте, минуя прокси, и аннотации (например, `@Transactional`) игнорируются. Self-Injection обходит это ограничение.  

**Альтернативы:**  
- Использовать `AopContext.currentProxy()` (менее удобно).  
- Перейти на AspectJ (но это сложнее).
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы