Comments 14
Очень интересно изложено. Спасибо! Жду следующую часть!
Очень жду статью про индексы.
Мне кажется момент с вызовом из PostConstruct метода с Transactional аннотацией у вас неверный
@Service
public class OrderService {
@Autowired
private PaymentService paymentService;
@PostConstruct
public void init() {
// Вызов транзакционного метода внутри @PostConstruct
paymentService.processPayment(); // @Transactional здесь не сработает
}
}
@Service
public class PaymentService {
@Transactional
public void processPayment() {
System.out.println("Оплата выполнена");
}
}
Потому как оно в таком виде должно сработать и работает (только что попробовал у себя, а то вдруг я чего не знаю :) )
Обороачивается в прокси же PaymentService и до того, как инстанс этого бина занижектится в OrderService. То-есть при вызове из PostConstruct все саработает как и ожидается. А для сомого OrderService должно быть все равно, обернуто оно в прокси или нет.
Вот такой мой пример выдает "Stored entities 0" c Transactional. И выдает "Stored entities 2" если аннотацию убрать, так как в этом случае на каждый вызов repo.save создается своя транзакция.
@RequiredArgsConstructor
@Component
public class BeanB {
private final MyRepository repo;
@Transactional
public void doSomethingTransactional(){
int i = 0;
repo.save(new MyEntity());
i++;
repo.save(new MyEntity());
i++;
if(i > 1) {
throw new RuntimeException("Boom");
}
}
public Long count() {
return repo.count();
}
}
@Slf4j
@RequiredArgsConstructor
@Component
public class BeanA {
private final BeanB b;
@PostConstruct
public void init(){
try {
b.doSomethingTransactional();
} catch (Exception e) {
log.info("Stored entities {}", b.count());
}
}
}Да, извиняюсь, пример взял с другого класса, не оттуда 😅
Поправил в статье, спасибо большое!)
Ох уж эти мне "Senior Java Developer в одном из банков" с их LLM-сгенерированными статьями про тривиальности, но с хреновой тучей ошибок. Вот к примеру, в разделе Spring AOP вариант "как починить" - лютая дичь, тупая LLM-ка правильно перед этим написала, почему именно Transactional не сработает, но тут же снова генерирует код с прямым вызовом метода, оно всё равно не проходит через proxy (ну и там опечатка, оно не скомпилируется).
Доказывать что-то мне нет смысла)
Информацию беру из конспектов + пытаюсь добавить что-то интересное и из интернета, конечно, помогают LLM, грех не пользоваться. Насчет ошибки в примере - она была, вчера, когда правил код с телефона стер не нужное, бывает, все ошибаются, не вижу в этом ничего плохо. Я только начинаю писать статьи, поэтому спасибо вам за критику и комментарий)
❗❗Дисклеймер❗❗
А это что? Просто чтобы написать эмодзи на ПК, особенно под Линуксом (в винде-то достаточно открыть эмодзи-клаву через соответствующий хоткей - но этот хоткей мало кто знает) - это несколько геморно. Поэтому тут 2 варианта - либо смартфон, либо ЛЛМ.
И да - я тоже юзаю ЛЛМ, и даже в рамках Хабра тестировал формат AI-сгенерированных статей - но даже мне это не особо зашло. Даже подбирать темы через LLM - одно мучение.
ПыСы: вы помните ту мою серию статей про Фидонет, которая на тот момент взорвала Хабр? Так вот, я до сих пор не могу побить тот рекорд (а это был реальный взрыв - с нуля до 110-го места всего за неделю наверное) - я на тот момент делитнул аккаунт из за своей самоненависти/самобичевания насчёт комментов на том аккаунте. Восстановить аккаунт уже естественно нельзя, карму и рейтинг тоже, а вот статьи всё-таки вернули в @Deleted-user, да и инвайт тоже перенесли. Но тот успех и взрыв Хабра я уже не смог перенести, и стать вторым Монобогданом тоже :(
Подводный камень: если внедрить Prototype внутрь Singleton, Spring создаст только один экземпляр при создании Singleton, а не новый каждый раз.
Новый объект будет создаваться именно каждый раз, когда бин запрашивается из контекста. А то, что для кого-то оказывается сюрпризом, что создание и, соответственно, инъекция зависимостей синглтона - единоразовая акция, тут уж, извините, ой.
Ну, и вообще это не проблема. Т.к. инъектируемая прокся просто создаёт новый экземпляр на каждый вызов метода. Правда, для этого контекст нужно настраивать, а не настройки по умолчанию использовать.
Привет, MishaBucha! Спасибо за статьи :)
Вопрос возник:
Подводный камень: если внедрить Prototype внутрь Singleton, Spring создаст только один экземпляр при создании Singleton, а не новый каждый раз.
Что если prototype будет иметь scope=request, session? Что будет если использовать аннотацию LookUp над prototype bean в синглтоне?
Spring без боли: моя шпаргалка для собесов в Java. Часть 3