Pointcut или Aspect вокруг всех методов обслуживания с аннотацией @Transactional (readOnly = false) - PullRequest
0 голосов
/ 19 ноября 2018

Можно ли использовать Spring AOP или AspectJ для перехвата всех методов Service (содержащихся в классах в пакете com.app.service.*), имеющих аннотацию

@Transactional(readOnly = false)

(возможны и другие элементы в * 1005 Spring)* аннотации, но нас интересует только readOnly = false).

Я мог бы найти только примеры, относящиеся к pointcut с простыми аннотациями, или @Annotation(value).

Я бы предпочел использовать прямую Spring, если возможно.

Вероятно, это будет что-то вроде ниже, но не уверен насчет синтаксиса.

@Around("execution(* com.app.service..*.*(..))" && @Transactional[??])

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вы хотите использовать pointcut следующим образом:

execution(@org.springframework.transaction.annotation.Transactional(readOnly = false) * com.app.service..*.*(..))
0 голосов
/ 21 ноября 2018

К сожалению, нет простого способа сделать это. Даже когда у нас есть основанный на аннотации pointcut, например,

@Aspect
@Component
@EnableAspectJAutoProxy
public class WriteTransactionAspectBean {

    @Before("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void test(org.springframework.transaction.annotation.Transactional t) {
        System.out.println("TEST");
    }

}

проблема в том, что аннотации принадлежат не нам, а из внешнего JAR-файла (Hibernate). Это потребует ткачества на время загрузки или другого сложного обходного пути.

Aspectj: метод перехвата от внешней банки

Но, чтобы сделать вещи еще хуже, Аннотации должны RetentionPolicy=RUNTIME, чтобы быть "обнаруженными" Pointcuts. И нам нужно пройти через каждый метод и добавить эту спецификацию к каждому @Transactional. Невозможно автоматически сделать все @Transactional исполняемыми в приложении.

...