Как обрабатывать внутренние вызовы на прокси Spring / EJB / Mockito…?

Как вы многие знаете, когда вы проксируете объект, например, когда вы создаете bean-компонент с транзакционными атрибутами для Spring / EJB или даже когда вы создаете частичный макет с некоторыми фреймворками, объект прокси не знает этого, а внутренние вызовы не перенаправляются, а затем и не перехватываются ...

Вот почему, если вы сделаете что-то подобное в Spring:

@Transactionnal
public void doSomething() {
    doSomethingInNewTransaction();
    doSomethingInNewTransaction();
    doSomethingInNewTransaction();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomethingInNewTransaction() {
    ...
}

Когда вы вызываете doSomething, вы ожидаете, что у вас будет 3 новых транзакции в дополнение к основной, но на самом деле из-за этой проблемы вы получите только одну ...


Так что мне интересно, как вы справляетесь с подобными проблемами ...

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

Это меня очень беспокоит, потому что весь код принадлежит одному функциональному домену и не должен быть разделен ...

Я нашел этот связанный вопрос с интересными ответами: Spring - @Transactional - Что происходит в фоновом режиме?

Роб Х. говорит, что мы можем внедрить прокси Spring внутри службы и вызвать прокси. doSomethingInNewTransaction (); вместо этого. Это довольно легко сделать, и это работает, но мне это не очень нравится ...

Юньфэн Хоу говорит следующее:

Итак, я пишу свою собственную версию CglibSubclassingInstantiationStrategy и {{1 }} создатель прокси, чтобы он использовал CGLIB для создания реального подкласса , который делегирует вызов своему суперу, а не другому экземпляру, что сейчас делает Spring. Таким образом, я могу свободно комментировать любые методы (пока не является частным), и где бы я ни вызвал эти методы, о них позаботятся. Что ж, мне еще нужно заплатить: 1. Я должен перечислить все аннотации, которые я хочу включить в создание нового подкласса CGLIB . 2. Я не могу комментировать последний метод, поскольку сейчас я генерирую подкласс, поэтому последний метод не может быть перехвачен.

Что он имеет в виду, говоря «какая весна сейчас творится»? Означает ли это, что внутренние транзакционные вызовы теперь перехватываются?


Как вы думаете, что лучше?

Вы разделяете свои классы, когда вам нужна некоторая детализация транзакций? Или вы используете обходной путь, как указано выше? (поделитесь, пожалуйста)

15
задан Community 23 May 2017 в 12:24
поделиться