Как стать автором
Обновить

Комментарии 10

Спасибо, интересная статья.
А мой любимый вопрос такой: расскажите про проксирование в Спринге))
а вам нужен специалист знающий ядро спринга? у вас есть задачи на переписывание/изменение ядра спринга? Или вы пишете свой аналог спринга?

ИЛИ

ваши задачи это просто реализация бизнес логики и вы хотите просто поумничать?
При чем здесь переписывание спринга? Понимать что такое проксирование нужно хотя бы при отладке, когда видишь всякие прокси-надстройки поверх своих классов, например когда дебажишь транзакции или секьюрити на бизнесовые методы, и т.д. Это всё базовые возможности спринга.
да и в целом, понимая, что «магия» спринга, например, при работе с транзакциями, осуществляется за счет прокси-классов, можно отсечь глупые ошибки с вызовом transactional-метода из того же класса
Да не только transactinal, эта ошибка встречается и других проксированных методов, например помеченных секьюрными аннотациями.
поэтому я и написал «например»)
Интересно, можно ли как-то сделать, чтобы Спринг автоматически отлавливал такие косяки на стадии компиляции или запуска приложения.

Знать инструмент, с которым работаешь, всегда полезно. Тогда будет меньше магии и больше понимания, что делают высокоуровневые конструкции, чтобы не делать глупых и неоптимальных вещей.

Очень полезная статья для новичков. Большое спасибо!

Мой любимый развод спрингера, JEE-шника и любого фреймворкера на собеседовании: можно ли использовать в приложении следующий код:


@Singleton
public class MyService {
    @PersistenceContext
    EntityManager entityManager;

    @Transactional
    public void doSomething() {
        // используем EntityManager
    }
}

После недолгого обдумывания поциент соглашается — "а почему нет"? На что я обращаю внимание, что бин у нас Singleton, и задаю следующие наводящие вопросы:


  • Сколько раз и когда инъектится EntityManager в поле singleton-бина? Правильный ответ: 1, при создании самого бина.
  • В JPA EntityManager — это thread-safe объект? Правильный ответ: НЕТ.
  • Может ли здесь возникнуть конфликт, когда две параллельные транзакции обращаются к одному не thread-safe объекту EntityManager? Правильный ответ: НЕТ, т.к. в данном случае в поле entityManager инъектируется обертка над реальным объектом EntityManager, который в свою очередь привязан к текущей транзакции. Управление осуществляется контейнером/фреймворком.

Большинство валится на третьем вопросе, отвечая, что код некорректен. Ну и как бы общий вопрос на понимание DI:


  • Когда бин с областью "prototype" инъектируется в "singleton", какую область видимости будет он иметь? Правильный ответ: SINGLETON за исключением, если въявную не включен proxying (ScopedProxyMode, etc).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории