Pull to refresh

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());
        }
    }
}


Да, извиняюсь, пример взял с другого класса, не оттуда 😅

Поправил в статье, спасибо большое!)

Ну теперь только объяснение и как поправить надо исправить. Оно в примере не работает, потому как вызов метода идет мимо прокси, напрямую и либо надо надо будет через контекст попросить ссылку на себя самого (self) либо вынести метод в другой бин

Ох уж эти мне "Senior Java Developer в одном из банков" с их LLM-сгенерированными статьями про тривиальности, но с хреновой тучей ошибок. Вот к примеру, в разделе Spring AOP вариант "как починить" - лютая дичь, тупая LLM-ка правильно перед этим написала, почему именно Transactional не сработает, но тут же снова генерирует код с прямым вызовом метода, оно всё равно не проходит через proxy (ну и там опечатка, оно не скомпилируется).

Доказывать что-то мне нет смысла)
Информацию беру из конспектов + пытаюсь добавить что-то интересное и из интернета, конечно, помогают LLM, грех не пользоваться. Насчет ошибки в примере - она была, вчера, когда правил код с телефона стер не нужное, бывает, все ошибаются, не вижу в этом ничего плохо. Я только начинаю писать статьи, поэтому спасибо вам за критику и комментарий)

❗❗Дисклеймер❗❗

А это что? Просто чтобы написать эмодзи на ПК, особенно под Линуксом (в винде-то достаточно открыть эмодзи-клаву через соответствующий хоткей - но этот хоткей мало кто знает) - это несколько геморно. Поэтому тут 2 варианта - либо смартфон, либо ЛЛМ.

И да - я тоже юзаю ЛЛМ, и даже в рамках Хабра тестировал формат AI-сгенерированных статей - но даже мне это не особо зашло. Даже подбирать темы через LLM - одно мучение.

ПыСы: вы помните ту мою серию статей про Фидонет, которая на тот момент взорвала Хабр? Так вот, я до сих пор не могу побить тот рекорд (а это был реальный взрыв - с нуля до 110-го места всего за неделю наверное) - я на тот момент делитнул аккаунт из за своей самоненависти/самобичевания насчёт комментов на том аккаунте. Восстановить аккаунт уже естественно нельзя, карму и рейтинг тоже, а вот статьи всё-таки вернули в @Deleted-user, да и инвайт тоже перенесли. Но тот успех и взрыв Хабра я уже не смог перенести, и стать вторым Монобогданом тоже :(

Можно просто скопировать откуда угодно)) я так делаю, пишешь в гугле имодзи, и сейчас можно просто тыкнуть правой кнопкой и там будут эмодзи, на винде 11 + Яндекс браузере работает)

Подводный камень: если внедрить Prototype внутрь Singleton, Spring создаст только один экземпляр при создании Singleton, а не новый каждый раз.

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

Ну, и вообще это не проблема. Т.к. инъектируемая прокся просто создаёт новый экземпляр на каждый вызов метода. Правда, для этого контекст нужно настраивать, а не настройки по умолчанию использовать.

Привет, MishaBucha! Спасибо за статьи :)
Вопрос возник:

Подводный камень: если внедрить Prototype внутрь Singleton, Spring создаст только один экземпляр при создании Singleton, а не новый каждый раз.

Что если prototype будет иметь scope=request, session? Что будет если использовать аннотацию LookUp над prototype bean в синглтоне?

Привет, рад, что вам понравилось)
LookUp правильный и гарантированный способ получать новый prototype каждый раз)

Sign up to leave a comment.

Articles