Устаревшее приложение Spring — что означает значение pointcut?

Я «унаследовал» старое устаревшее приложение Spring. В настоящее время он использует Spring 2.5 (только что обновил его один раз), и я собираюсь обновить его до Spring 3.

Я понимаю большую часть конфигурации приложения. Есть только одна часть, в которой я «не на 100%». Я могу примерно предположить, что это может означать, но мне нужно быть абсолютно уверенным, поэтому я публикую этот вопрос:

Вот фрагмент конфигурации (зависит от диспетчера транзакций, управляемого аннотациями, который здесь не показан):

<aop:config>
    <aop:advisor pointcut="execution(* *..ProductManager.*(..))"
        advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="save*" />
        <tx:method name="*" read-only="false" />
    </tx:attributes>
</tx:advice>

Мои конкретные два вопроса:

  • Что означает «выполнение (* ..ProductManager.(..))» (я понимаю язык pointcut)
  • В разделе атрибутов совета мы говорим применить транзакцию ко всем методам, связанным с сохранением *, и для всего, что только для чтения является ложным. Может ли кто-нибудь объяснить, почему эта настройка имеет смысл? Является ли это аддитивным и эффективно говорящим, для всех методов с поддержкой транзакций (т.е. просто методов сохранения *) я также хочу, чтобы эти методы НЕ были транзакциями только для чтения. Или он применяет что-то другое (например, некоторую форму поддержки транзакций) к каждому методу инклюзивного фильтра транзакций (определенному в pointcut).

Спасибо за любые разъяснения. Пожалуйста, без общих ответов - мне нужно конкретное объяснение этого.


person arcseldon    schedule 04.03.2013    source источник


Ответы (2)


execution(* *..ProductManager.*(..)) означает, что "для всех методов класса ProductManager"

настройки tx:advice не складываются. В нем говорится, что для всех методов, начинающихся с save, используются настройки транзакции по умолчанию. Для других этот параметр означает, что они НЕ являются транзакциями только для чтения.

Для здравого смысла следовало бы ожидать

<tx:method name="save*" read-only="false" />
<tx:method name="*" />
person Serkan Arıkuşu    schedule 04.03.2013
comment
Арикусу - Спасибо, отличный ответ и согласен с моим пониманием. Это одно из самых некачественных приложений, с которыми я работал за много лет. К сожалению, в базе кода нет класса ProductManager, поэтому я предполагаю, что управление транзакциями мертво. Я полностью согласен с вами в том, что строка сохранения * обычно является строкой, которую вы также указываете только для чтения. Это одно из тех приложений, где вы ничего не можете интуитивно понять. Ни одного тестового примера, и это приложение должно быть построено и поддержано в течение 6-8 лет. Да, эти приложения все еще там. - person arcseldon; 04.03.2013

Поскольку tx:method имеет атрибут read-only со значением по умолчанию false, это означает, что транзакция доступна для чтения/записи.

Так что, на мой взгляд,

<tx:method name="save*" read-only="false" /> <tx:method name="*" />

эквивалентно

<tx:method name="*" />

person vn801106    schedule 19.03.2013