Gdzie umieścić @ Transactional? W specyfikacji interfejsu czy implementacji?

Jaka jest najlepsza praktyka umieszczania adnotacji @Transactional? Czy powinienem dodać adnotację do metody interfejsu lub implementacji?

Author: naXa, 2011-04-05

4 answers

Dobre pytanie. Zawsze wkładałem to w realizację. Być może dlatego, że jest to detal implementacji, a nie abstrakcja.

Możesz chcieć, aby różne implementacje miały różne zachowania transakcyjne.

El Guapo zauważył, że oprócz tego, istnieje więcej problemów, które mogą wyniknąć z wprowadzenia na interfejs, związanych ze strategią proxyingu.

 28
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 12:12:36

To naprawdę zależy od architektury aplikacji, moim zdaniem. To zależy od tego, jak będziesz proxyował swoje zajęcia. Jeśli masz ustawioną aplikację na proxy-target-class='true' (w kontekście aplikacji, to informacje @Transactional nie zostaną odebrane, jeśli dodasz adnotację do interfejsu.

Aby uzyskać więcej informacji, Sprawdź Spring Docs -- "Tips".

Spring zaleca, aby adnotować tylko konkretne klasy (i metody klas betonowych) za pomocą adnotacji @ Transactional, jako w przeciwieństwie do adnotacji interfejsów. Z pewnością można umieścić adnotację @Transactional na interfejsie (lub metodzie interfejsu), ale działa to tylko tak, jak można się tego spodziewać, jeśli używasz proxy oparte na interfejsie. Fakt, że adnotacje Javy nie są dziedziczone z interfejsów oznacza, że jeśli używasz proxy opartych na klasach (proxy-target-class="true") lub aspektu opartego na weavingu (mode="aspectj"), ustawienia transakcji nie są rozpoznawane przez infrastrukturę proxy i weaving, a obiekt nie będzie zawinięty w proxy transakcyjne, co byłoby zdecydowanie złe.

 40
Author: El Guapo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 14:54:40

Podczas gdy zarządzanie transakcjami jest szczegółem implementacji w wielu przypadkach dość często jest to również szczegół interfejsu. Na przykład, definiując interfejs usług Twojej aplikacji, możesz rozważyć wprowadzenie @Transactional do definicji interfejsu, aby dokładnie wyjaśnić, jakiej strategii propagacji używasz.

 1
Author: Oleg Iavorskyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 12:16:40

Nie używam interfejsów w moim systemie, bo jak na razie nie widzę możliwości zaimplementowania czegokolwiek na nim. Dodałem więc adnotacje na temat realizacji i wierzę, że wiosna sprawi, że wszystko będzie dla mnie poprawne.

Myślę, że nie wszystkie klasy muszą mieć interfejsy. Widzę wiele architektur z wieloma wzorami i wszystkie kochają interfejsy. Ale pytanie: jeśli umieścisz adnotację Spring w interfejsie i z jakiegoś powodu chcesz innego podejście do transakcji z klasą implementacyjną wykonaną przez ten interfejs, nie można tego zrobić. A może się mylę?

Zdrówko.

 0
Author: Luiz Feijão Veronesi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-30 16:04:16