Μπορούν οι σχολιασμοί @Component
, @Repository
και @Service
να χρησιμοποιηθούν εναλλακτικά στην Spring ή παρέχουν κάποια συγκεκριμένη λειτουργικότητα εκτός από το να λειτουργούν ως μέσο συμβολισμού;
Με άλλα λόγια, αν έχω μια κλάση Service και αλλάξω τον σχολιασμό από @Service
σε @Component
, θα εξακολουθεί να συμπεριφέρεται με τον ίδιο τρόπο;
Ή μήπως ο σχολιασμός επηρεάζει και τη συμπεριφορά και τη λειτουργικότητα της κλάσης;
Από την Τεκμηρίωση της Άνοιξης:
Στην Spring 2.0 και μεταγενέστερες εκδόσεις, ο σχολιασμός
@Repository
είναι ένας δείκτης για κάθε κλάση που πληροί το ρόλο ή το στερεότυπο (επίσης γνωστό ως Data Access Object ή DAO) ενός αποθετηρίου. Μεταξύ των χρήσεων αυτού του δείκτη είναι η αυτόματη μετάφραση των εξαιρέσεων. >, Η Spring 2.5 εισάγει περαιτέρω επισημάνσεις στερεοτύπων:@Component
,@Service
, και@Controller
. Το@Component
είναι ένα γενικό στερεότυπο για κάθε συστατικό που διαχειρίζεται η Spring. Τα@Repository
,@Service
και@Controller
είναι εξειδικεύσεις του@Component
για πιο συγκεκριμένες περιπτώσεις χρήσης, για παράδειγμα παραδείγματος χάριν, στα επίπεδα επιμονής, υπηρεσιών και παρουσίασης, αντίστοιχα. >, Επομένως, μπορείτε να επισημάνετε τις κλάσεις συστατικών σας με@Component
, αλλά σχολιάζοντάς τες με@Repository
,@Service
, ή@Controller
, οι κλάσεις σας είναι πιο κατάλληλες για επεξεργασία από εργαλεία ή για τη συσχέτιση με πτυχές. Για παράδειγμα, αυτές οι σημειώσεις στερεοτύπων αποτελούν ιδανικούς στόχους για pointcuts. >, Έτσι, εάν επιλέγετε μεταξύ της χρήσης του@Component
ή του@Service
για το επίπεδο υπηρεσιών σας, το@Service
είναι σαφώς η καλύτερη επιλογή. Ομοίως, όπως αναφέρθηκε παραπάνω, το@Repository
υποστηρίζεται ήδη ως δείκτης για αυτόματη μετάφραση εξαιρέσεων στο στρώμα εμμονής σας.
┌────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning │
├────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository│ stereotype for persistence layer │
│ @Service │ stereotype for service layer │
│ @Controller│ stereotype for presentation layer (spring-mvc) │
└────────────┴─────────────────────────────────────────────────────┘
Είναι σχεδόν ίδιες - όλες σημαίνουν ότι η κλάση είναι ένα φασόλι της Spring. Οι @Service
, @Repository
και @Controller
είναι εξειδικευμένα @Component
. Μπορείτε να επιλέξετε να εκτελέσετε συγκεκριμένες ενέργειες με αυτά. Για παράδειγμα:
@Controller
χρησιμοποιούνται από το spring-mvc@Repository
είναι επιλέξιμα για μετάφραση εξαιρέσεων εμμονήςΈνα άλλο πράγμα είναι ότι ορίζετε τα συστατικά σημασιολογικά σε διαφορετικά επίπεδα.
Ένα πράγμα που προσφέρει το @Component
είναι ότι μπορείτε να επισημάνετε άλλες επισημάνσεις με αυτό και στη συνέχεια να τις χρησιμοποιήσετε με τον ίδιο τρόπο όπως το @Service
.
Για παράδειγμα, πρόσφατα έκανα:
@Component
@Scope("prototype")
public @interface ScheduledJob {..}
Έτσι, όλες οι κλάσεις που σχολιάζονται με @ScheduledJob
είναι spring beans και επιπλέον είναι καταχωρημένες ως quartz jobs. Απλά πρέπει να παρέχετε κώδικα που να χειρίζεται το συγκεκριμένο annotation.
Η χρήση των σχολίων @Service
και @Repository
είναι σημαντική από την άποψη της σύνδεσης με τη βάση δεδομένων.
@Service
για όλες τις συνδέσεις σας με ΒΔ τύπου web service.@Repository
για όλες τις συνδέσεις σας με αποθηκευμένες διαδικασίες DB.Εάν δεν χρησιμοποιήσετε τις κατάλληλες επισημειώσεις, ενδέχεται να αντιμετωπίσετε εξαιρέσεις δέσμευσης που παρακάμπτονται από συναλλαγές επαναφοράς. Θα δείτε εξαιρέσεις κατά τη διάρκεια του stress load test που σχετίζονται με συναλλαγές roll back JDBC.