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?
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.
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.
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.
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.
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.
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