Ποια είναι η διαφορά μεταξύ των σχολίων @Component, @Repository & @Service στην Άνοιξη;

Μπορούν οι σχολιασμοί @Component, @Repository και @Service να χρησιμοποιηθούν εναλλακτικά στην Spring ή παρέχουν κάποια συγκεκριμένη λειτουργικότητα εκτός από το να λειτουργούν ως μέσο συμβολισμού;

Με άλλα λόγια, αν έχω μια κλάση Service και αλλάξω τον σχολιασμό από @Service σε @Component, θα εξακολουθεί να συμπεριφέρεται με τον ίδιο τρόπο;

Ή μήπως ο σχολιασμός επηρεάζει και τη συμπεριφορά και τη λειτουργικότητα της κλάσης;

Από την Τεκμηρίωση της Άνοιξης:

Στην Spring 2.0 και μεταγενέστερες εκδόσεις, ο σχολιασμός @Repository είναι ένας δείκτης για κάθε κλάση που πληροί το ρόλο ή το στερεότυπο (επίσης γνωστό ως Data Access Object ή DAO) ενός αποθετηρίου. Μεταξύ των χρήσεων αυτού του δείκτη είναι η αυτόματη μετάφραση των εξαιρέσεων. &gt, Η Spring 2.5 εισάγει περαιτέρω επισημάνσεις στερεοτύπων: @Component, @Service, και @Controller. Το @Component είναι ένα γενικό στερεότυπο για κάθε συστατικό που διαχειρίζεται η Spring. Τα @Repository, @Service και @Controller είναι εξειδικεύσεις του @Component για πιο συγκεκριμένες περιπτώσεις χρήσης, για παράδειγμα παραδείγματος χάριν, στα επίπεδα επιμονής, υπηρεσιών και παρουσίασης, αντίστοιχα. &gt, Επομένως, μπορείτε να επισημάνετε τις κλάσεις συστατικών σας με @Component, αλλά σχολιάζοντάς τες με @Repository, @Service, ή @Controller , οι κλάσεις σας είναι πιο κατάλληλες για επεξεργασία από εργαλεία ή για τη συσχέτιση με πτυχές. Για παράδειγμα, αυτές οι σημειώσεις στερεοτύπων αποτελούν ιδανικούς στόχους για pointcuts. &gt, Έτσι, εάν επιλέγετε μεταξύ της χρήσης του @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)      │
└────────────┴─────────────────────────────────────────────────────┘
Σχόλια (12)

Είναι σχεδόν ίδιες - όλες σημαίνουν ότι η κλάση είναι ένα φασόλι της Spring. Οι @Service, @Repository και @Controller είναι εξειδικευμένα @Component. Μπορείτε να επιλέξετε να εκτελέσετε συγκεκριμένες ενέργειες με αυτά. Για παράδειγμα:

  • Τα φασόλια @Controller χρησιμοποιούνται από το spring-mvc
  • Τα φασόλια @Repository είναι επιλέξιμα για μετάφραση εξαιρέσεων εμμονής

Ένα άλλο πράγμα είναι ότι ορίζετε τα συστατικά σημασιολογικά σε διαφορετικά επίπεδα.

Ένα πράγμα που προσφέρει το @Component είναι ότι μπορείτε να επισημάνετε άλλες επισημάνσεις με αυτό και στη συνέχεια να τις χρησιμοποιήσετε με τον ίδιο τρόπο όπως το @Service.

Για παράδειγμα, πρόσφατα έκανα:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Έτσι, όλες οι κλάσεις που σχολιάζονται με @ScheduledJob είναι spring beans και επιπλέον είναι καταχωρημένες ως quartz jobs. Απλά πρέπει να παρέχετε κώδικα που να χειρίζεται το συγκεκριμένο annotation.

Σχόλια (3)

Η χρήση των σχολίων @Service και @Repository είναι σημαντική από την άποψη της σύνδεσης με τη βάση δεδομένων.

  1. Χρησιμοποιήστε το @Service για όλες τις συνδέσεις σας με ΒΔ τύπου web service.
  2. Χρησιμοποιήστε το @Repository για όλες τις συνδέσεις σας με αποθηκευμένες διαδικασίες DB.

Εάν δεν χρησιμοποιήσετε τις κατάλληλες επισημειώσεις, ενδέχεται να αντιμετωπίσετε εξαιρέσεις δέσμευσης που παρακάμπτονται από συναλλαγές επαναφοράς. Θα δείτε εξαιρέσεις κατά τη διάρκεια του stress load test που σχετίζονται με συναλλαγές roll back JDBC.

Σχόλια (2)