Προγραμματισμός

Τι είναι η Άνοιξη; Ανάπτυξη βάσει στοιχείων για Java

Η άνοιξη είναι ίσως το καλύτερο από τα βασικά συστατικά πλαίσια που εμφανίστηκαν στις αρχές του 21ου αιώνα. Βελτιώνει σε μεγάλο βαθμό τον τρόπο με τον οποίο οι προγραμματιστές γράφουν και παραδίδουν κώδικα υποδομής σε εφαρμογές που βασίζονται σε Java. Από την ίδρυσή της, η άνοιξη έχει αναγνωριστεί ως ένα κορυφαίο πλαίσιο για την ανάπτυξη Java για επιχειρήσεις. Ως ολοκληρωμένο πλαίσιο εφαρμογής, το Spring αντικατοπτρίζει ορισμένες από τις δυνατότητες Java EE, αλλά προσφέρει έναν συνδυασμό χαρακτηριστικών και συμβάσεων προγραμματισμού που δεν θα βρείτε αλλού.

Αυτό το άρθρο παρουσιάζει την άνοιξη και τη βασική φιλοσοφία και μεθοδολογία προγραμματισμού: Αντιστροφή έγχυσης ελέγχου και εξάρτησης. Θα ξεκινήσετε επίσης με τους εαρινούς σχολιασμούς και μερικά πρακτικά παραδείγματα κωδικοποίησης.

Έγχυση εξάρτησης και αντιστροφή του ελέγχου

Η βασική ιδέα της Άνοιξης είναι ότι αντί να διαχειρίζεστε τις σχέσεις αντικειμένων μόνοι σας, τις εκφορτώνετε στο πλαίσιο. Η αντιστροφή του ελέγχου (IOC) είναι η μεθοδολογία που χρησιμοποιείται για τη διαχείριση των σχέσεων αντικειμένων. Η έγχυση εξάρτησης είναι ο μηχανισμός για την εφαρμογή της ΔΟΕ. Δεδομένου ότι αυτές οι δύο έννοιες σχετίζονται αλλά είναι διαφορετικές, ας τις εξετάσουμε πιο προσεκτικά:

  • Αντιστροφή του ελέγχου (IOC) κάνει ό, τι λέει το όνομά του: αναστρέφει την παραδοσιακή ιεραρχία ελέγχου για την εκπλήρωση αντικειμένων σχέσεων. Αντί να βασίζεστε στον κώδικα εφαρμογής για να καθορίσετε τον τρόπο με τον οποίο τα αντικείμενα σχετίζονται μεταξύ τους, οι σχέσεις καθορίζονται από το πλαίσιο. Ως μεθοδολογία, η IOC εισάγει συνέπεια και προβλεψιμότητα στις σχέσεις αντικειμένου, αλλά απαιτεί από εσάς, ως προγραμματιστής, να εγκαταλείψετε κάποιον λεπτομερή έλεγχο.
  • Ενεση εξάρτησης (DI) είναι ένας μηχανισμός όπου το πλαίσιο "εισάγει" εξαρτήσεις στην εφαρμογή σας. Είναι η πρακτική εφαρμογή της ΔΟΕ. Η έγχυση εξάρτησης εξαρτάται από τον πολυμορφισμό, με την έννοια ότι επιτρέπει την αλλαγή της εκπλήρωσης ενός τύπου αναφοράς με βάση τις διαμορφώσεις στο πλαίσιο. Το πλαίσιο εισάγει μεταβλητές αναφορές αντί να πληρούνται χειροκίνητα στον κώδικα εφαρμογής.

JSR-330

Όπως και στον κόσμο της Java, αυτό που ξεκίνησε ως in-the-wild καινοτομία, το Spring, απορροφήθηκε εν μέρει από τις τυπικές προδιαγραφές. Σε αυτήν την περίπτωση, το JSR-330 είναι το πρότυπο Java. Το ωραίο πράγμα για την προδιαγραφή JSR-330 είναι ότι μπορείτε να το χρησιμοποιήσετε αλλού και θα το δείτε να χρησιμοποιείται αλλού, πέρα ​​από την Άνοιξη. Μπορείτε να το χρησιμοποιήσετε χωρίς να χρησιμοποιήσετε την Άνοιξη. Ωστόσο, η Άνοιξη φέρνει πολύ περισσότερα στο τραπέζι.

Παράδειγμα # 1: Ένεση εξάρτησης από την άνοιξη

Η αντιστροφή της έγχυσης ελέγχου και εξάρτησης γίνεται καλύτερα κατανοητή με τη χρήση τους, οπότε θα ξεκινήσουμε με ένα γρήγορο παράδειγμα προγραμματισμού.

Ας πούμε ότι μοντελοποιείτε ένα αυτοκίνητο. Εάν κάνετε μοντελοποίηση σε απλή παλιά Java, ενδέχεται να έχετε ένα μέλος διεπαφής στο Αυτοκίνητο τάξη για αναφορά Μηχανή διεπαφή, όπως φαίνεται στην καταχώριση 1.

Λίστα 1. Αντικείμενο σχέσεων σε απλή παλιά Java

 δημόσιος κινητήρας διεπαφής () {...} Αυτοκίνητο δημόσιας κατηγορίας {ιδιωτικός κινητήρας κινητήρα public Engine getEngine () {...} public void setEngine (Engine engine) {...}} 

Η λίστα 1 περιέχει μια διεπαφή για ένα Μηχανή τύπος και μια κλάση για το σκυρόδεμα Αυτοκίνητο τύπος, που αναφέρεται στο Μηχανή. (Σημειώστε ότι σε ένα πραγματικό σενάριο προγραμματισμού αυτά θα ήταν σε ξεχωριστά αρχεία.) Τώρα, όταν δημιουργείτε ένα Αυτοκίνητο για παράδειγμα, θα έχετε ορίσει τον συσχετισμό όπως φαίνεται στην καταχώριση 2.

Λίστα 2. Δημιουργία αυτοκινήτου με τη διεπαφή κινητήρα

 // ... Αυτοκίνητο newCar = νέο Αυτοκίνητο (); Engine sixCylEngine = νέο InlineSixCylinderEngine (); newCar.setEngine (sixCylEngine); // Κάνετε πράγματα με το αυτοκίνητο 

Σημειώστε ότι δημιουργείτε το Αυτοκίνητο αντικείμενο πρώτα. Στη συνέχεια, δημιουργείτε ένα νέο αντικείμενο που πληροί το Μηχανή διεπαφή και εκχωρήστε το χειροκίνητα στο Αυτοκίνητο αντικείμενο. Έτσι λειτουργούν οι συσχετίσεις αντικειμένων σε απλή παλιά Java.

Μαθήματα μοντελοποίησης και αντικείμενα την άνοιξη

Τώρα ας δούμε το ίδιο παράδειγμα την άνοιξη. Εδώ, θα μπορούσατε να κάνετε κάτι σαν αυτό που εμφανίζεται στην καταχώριση 3. Ξεκινάτε με το Αυτοκίνητο τάξη, αλλά σε αυτήν την περίπτωση προσθέτετε έναν σχολιασμό σε αυτό: @Κάνω ένεση.

Λίστα 3. Παράδειγμα χρήσης του σχολιασμού @Inject την Άνοιξη

 Αυτοκίνητο δημόσιας κατηγορίας {@Inject Private Engine Engine; // ...} 

Χρησιμοποιώντας το @Κάνω ένεση σχολιασμός (ή @ Αυτόματο, εάν προτιμάτε) λέει στο Spring να πραγματοποιήσει αναζήτηση στο περιβάλλον και να εισάγει αυτόματα ένα αντικείμενο στην αναφορά, βάσει ενός συνόλου κανόνων.

Στη συνέχεια, σκεφτείτε το @Συστατικό σχολιασμός, που εμφανίζεται στην καταχώριση 4.

Λίστα 4. Σχολιασμός στοιχείων

 Το @Component public class InlineSixCylinderEngine υλοποιεί το Engine {// ...} 

Σχολιασμός τάξης με @Συστατικό λέει στην Spring ότι είναι διαθέσιμο για την πραγματοποίηση ενέσεων. Σε αυτήν την περίπτωση, το InlineSixCylEngine θα εγχύθηκε επειδή είναι διαθέσιμο και ικανοποιεί τις απαιτήσεις διεπαφής του συσχετισμού. Την άνοιξη, αυτό ονομάζεται «αυτόματη ενέσιμη» ένεση. (Δείτε παρακάτω για περισσότερα σχετικά με την Άνοιξη @ Αυτόματο σχόλιο.)

Αποσύνδεση ως αρχή σχεδιασμού

Η αντιστροφή του ελέγχου με έγχυση εξάρτησης αφαιρεί μια πηγή συγκεκριμένης εξάρτησης από τον κώδικά σας. Πουθενά στο πρόγραμμα δεν υπάρχει μια κωδικοποιημένη αναφορά στο Μηχανή εκτέλεση. Αυτό είναι ένα παράδειγμα του αποσύνδεση ως αρχή σχεδιασμού λογισμικού. Η αποσύνδεση του κώδικα εφαρμογής από την εφαρμογή καθιστά τον κώδικά σας ευκολότερο στη διαχείριση και συντήρηση. Η εφαρμογή γνωρίζει λιγότερα για το πώς τα μέρη της ταιριάζουν, αλλά είναι πολύ πιο εύκολο να κάνετε αλλαγές σε οποιοδήποτε σημείο του κύκλου ζωής της εφαρμογής.

@Autowired εναντίον @Inject

@ Αυτόματο και @Κάνω ένεση κάνε το ίδιο πράγμα. Ωστόσο, @Κάνω ένεση είναι ο τυπικός σχολιασμός Java, ενώ @ Αυτόματο είναι ειδικά για την Άνοιξη. Και οι δύο εξυπηρετούν τον ίδιο σκοπό να λένε στον κινητήρα DI να εγχύσει το πεδίο ή τη μέθοδο με ένα αντίστοιχο αντικείμενο. Μπορείτε να χρησιμοποιήσετε είτε μία την άνοιξη.

Επισκόπηση του εαρινού πλαισίου

Τώρα που έχετε δει κάποιο κωδικό Spring, ας ρίξουμε μια επισκόπηση του πλαισίου και των στοιχείων του. Όπως μπορείτε να δείτε, το πλαίσιο αποτελείται από τέσσερις κύριες ενότητες, οι οποίες χωρίζονται σε πακέτα. Η Άνοιξη σας δίνει αρκετή ευελιξία με τις ενότητες που θα χρησιμοποιήσετε.

  • Δοχείο πυρήνα
    • Πυρήνας
    • Φασόλι
    • Συμφραζόμενα
    • Γλώσσα έκφρασης
  • Προγραμματισμός με γνώμονα τις πτυχές (AOP)
    • ΑΟΠ
    • Πτυχές
    • Ενοργάνιση
  • Πρόσβαση και ενοποίηση δεδομένων
    • JDBC
    • JPA / ORM
    • JMS
    • Συναλλαγές
  • Ιστός
    • Ιστός / REST
    • Servlet
    • Γόνατα

Αντί να καλύψουμε τα πάντα εδώ, ας ξεκινήσουμε με δύο από τις πιο συχνά χρησιμοποιούμενες δυνατότητες του Spring.

Ξεκινώντας ένα νέο έργο: Spring Boot

Θα χρησιμοποιήσουμε το Spring Boot για να δημιουργήσουμε ένα παράδειγμα έργου, το οποίο θα χρησιμοποιήσουμε για να δοκιμάσουμε τις λειτουργίες Spring. Το Spring Boot διευκολύνει την έναρξη νέων έργων, όπως θα δείτε μόνοι σας. Για να ξεκινήσετε, ρίξτε μια ματιά στην κύρια τάξη που φαίνεται παρακάτω. Στο Spring Boot, μπορούμε να πάρουμε μια κύρια τάξη με ένα κύριος() και στη συνέχεια επιλέξτε να το εκτελέσετε αυτόνομο ή πακέτο για ανάπτυξη σε κοντέινερ όπως το Tomcat.

Η Λίστα 5 έχει τα περιγράμματα της κύριας τάξης μας, η οποία θα ισχύει σύμφωνα με το πρότυπο src / main / java / γεια τοποθεσία.

Λίστα 5. Κύρια τάξη με Spring Boot

 γεια σου πακέτο εισαγωγή org.springframework.boot.SpringApplication; εισαγωγή org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication δημόσια τάξη Εφαρμογή {public static void main (String [] args) {SpringApplication.run (Application.class, args); }} 

Σημειώστε δύο πράγματα σχετικά με τον παραπάνω κώδικα: Πρώτον, όλη η εργασία αφαιρείται στο πλαίσιο. Η κύρια τάξη ξεκινά την εφαρμογή, αλλά δεν γνωρίζει τίποτα για το πώς λειτουργεί η εφαρμογή ή παρέχει τη λειτουργικότητά της. Δεύτερον, το SpringApplication.run () κάνει την πραγματική δουλειά της εκκίνησης της εφαρμογής και της μετάδοσης στο Εφαρμογή η ίδια η τάξη. Και πάλι, η εργασία που κάνει η εφαρμογή δεν είναι εμφανής εδώ.

ο @SpringBootApplication Ο σχολιασμός ολοκληρώνει μερικούς τυπικούς σχολιασμούς και λέει στον Spring να κοιτάξει το πακέτο όπου υπάρχει η κύρια τάξη για εξαρτήματα. Στο προηγούμενο μας παράδειγμα, με το αυτοκίνητο και τον κινητήρα, αυτό θα επέτρεπε στην Spring να βρει όλες τις τάξεις με σχολιασμούς @Συστατικό και @Κάνω ένεση. Η ίδια η διαδικασία, που ονομάζεται σάρωση εξαρτημάτων, είναι εξαιρετικά προσαρμόσιμο.

Μπορείτε να δημιουργήσετε την εφαρμογή με το πρότυπο καθαρή εγκατάσταση mvnκαι μπορείτε να το εκτελέσετε με τον στόχο της Spring Boot (mvn spring-boot: εκτέλεση). Πριν το κάνουμε αυτό, ας δούμε αυτήν την εφαρμογή pom.xml αρχείο.

Λίστα 6. Starter pom.xml

 com.javaworld what-is-spring 1.0.0 org.springframework.boot spring-boot-starter-parent 2.1.3. ΑΝΑΚΟΙΝΩΣΗ 1.8 org.springframework.boot spring-boot-maven-plugin 

Σημειώστε δύο σημαντικές δυνατότητες στον παραπάνω κώδικα:

  1. ο μητρική εταιρεία το στοιχείο βασίζεται στο spring-boot-starter-γονέας έργο. Αυτό το γονικό έργο καθορίζει έναν αριθμό χρήσιμων προεπιλογών, όπως το προεπιλεγμένο επίπεδο μεταγλωττιστή του JDK 1.8. Ως επί το πλείστον, μπορείτε απλώς να εμπιστευτείτε ότι ξέρει τι κάνει. Για παράδειγμα, μπορείτε να παραλείψετε τον αριθμό έκδοσης για πολλές κοινές εξαρτήσεις και SpringBootParent θα ορίσει τις εκδόσεις να είναι συμβατές. Όταν ανεβάζετε τον αριθμό έκδοσης του γονέα, οι εκδόσεις εξάρτησης και οι προεπιλογές θα αλλάξουν επίσης.
  2. ο plug-spring-boot-maven-plugin επιτρέπει την εκτελέσιμη συσκευασία JAR / WAR και στη θέση τους τρέξιμο (μέσω του mvn spring-boot: εκτέλεση εντολή).

Προσθήκη του Spring Web ως εξάρτησης

Μέχρι στιγμής, μπορέσαμε να χρησιμοποιήσουμε άνοιξη-μπότα για να περιορίσουμε πόση δουλειά βάζουμε για να λειτουργήσουμε μια εφαρμογή. Τώρα ας προσθέσουμε μια εξάρτηση και να δούμε πόσο γρήγορα μπορούμε να πάρουμε κάτι σε ένα πρόγραμμα περιήγησης.

Λίστα 7. Προσθήκη Spring Web σε ένα έργο

  org.springframework.boot spring-boot-starter-web 

Σημείωση

Το Spring θα εντοπίσει αυτόματα τα αρχεία που έχουν αλλάξει και θα μεταγλωττιστεί ανάλογα. Μπορείτε απλά να εκτελέσετε mvn spring-boot: εκτέλεση για παραλαβή αλλαγών.

Τώρα που έχουμε μια βασική ρύθμιση έργου, είμαστε έτοιμοι για τα δύο παραδείγματα.

Παράδειγμα # 2: Δημιουργία RESTful τελικών σημείων με το Spring Web

Έχουμε χρησιμοποιήσει spring-boot-starter-web να φέρει πολλές εξαρτήσεις που είναι χρήσιμες για τη δημιουργία εφαρμογών ιστού. Στη συνέχεια θα δημιουργήσουμε ένα πρόγραμμα χειρισμού διαδρομής για μια διαδρομή URL. Η υποστήριξη ιστού της Spring αποτελεί μέρος της μονάδας Spring MVC (Model-View-Controller), αλλά μην την ανησυχείτε: Το Spring Web διαθέτει πλήρη και αποτελεσματική υποστήριξη για την κατασκευή RESTful τελικών σημείων.

Η τάξη της οποίας είναι η αποστολή αιτημάτων διευθύνσεων URL είναι γνωστή ως ελεγκτής, όπως φαίνεται στην καταχώριση 8.

Λίστα 8. Ελεγκτής ελατηρίου MVC REST

 γεια σου πακέτο εισαγωγή org.springframework.stereotype.Controller; εισαγωγή org.springframework.ui.Model; εισαγωγή org.springframework.web.bind.annotation.RequestMapping; εισαγωγή org.springframework.web.bind.annotation.RequestMethod; εισαγωγή org.springframework.web.bind.annotation.ResponseBody; εισαγωγή org.springframework.web.bind.annotation.RequestParam; @Controller δημόσια τάξη GreetingController {@RequestMapping (value = "/ hi", method = RequestMethod.GET) public String hi (@RequestParam (name = "name", required = false, defaultValue = "JavaWorld") Όνομα συμβολοσειράς, μοντέλο μοντέλου ) {επιστροφή "Γεια" + όνομα; }} 

Ο σχολιασμός @Controller

ο @Ελεγκτής Ο σχολιασμός προσδιορίζει μια τάξη ως ελεγκτή. Μια τάξη που επισημαίνεται ως ελεγκτής αναγνωρίζεται επίσης αυτόματα ως κλάση εξαρτημάτων, γεγονός που την καθιστά υποψήφια για αυτόματη καλωδίωση. Όπου χρειάζεται αυτός ο ελεγκτής, θα συνδεθεί στο πλαίσιο. Σε αυτήν την περίπτωση, θα το συνδέσουμε στο σύστημα MVC για τον χειρισμό αιτημάτων.

Ο ελεγκτής είναι ένα εξειδικευμένο είδος συστατικού. Υποστηρίζει το @RequestMapping και @ResponseBody σχολιασμοί που βλέπετε στο γεια() μέθοδος. Αυτοί οι σχολιασμοί παρέχουν στο πλαίσιο πώς να αντιστοιχίσετε αιτήματα διευθύνσεων URL στην εφαρμογή.

Σε αυτό το σημείο, μπορείτε να εκτελέσετε την εφαρμογή με mvn spring-boot: εκτέλεση. Όταν χτυπάτε το /γεια URL, θα λάβετε μια απάντηση όπως "Γεια, JavaWorld."

Παρατηρήστε πώς η Spring υιοθέτησε τα βασικά στοιχεία των εξαρτημάτων αυτόματης καλωδίωσης και έδωσε ένα ολόκληρο πλαίσιο ιστού. Με την Άνοιξη, δεν χρειάζεται να συνδέσετε ρητά τίποτα μαζί!

Οι σχολιασμοί @Request

ο @RequestMapping σας επιτρέπει να ορίσετε ένα πρόγραμμα χειρισμού για μια διαδρομή URL. Οι επιλογές περιλαμβάνουν τον καθορισμό της μεθόδου HTTP που θέλετε, κάτι που κάναμε σε αυτήν την περίπτωση. Φεύγοντας Αίτηση μεθόδου off θα δώσει εντολή στο πρόγραμμα να χειριστεί όλους τους τύπους μεθόδων HTTP.

ο @RequestParam Ο σχολιασμός ορίσματος μας επιτρέπει να χαρτογραφήσουμε τις παραμέτρους αιτήματος απευθείας στην υπογραφή της μεθόδου, συμπεριλαμβανομένης της απαίτησης ορισμένων παραμέτρων και του καθορισμού προεπιλεγμένων τιμών όπως έχουμε κάνει εδώ. Μπορούμε ακόμη και να αντιστοιχίσουμε ένα σώμα αιτήματος σε μια τάξη με το @RequestBody σχολιασμός επιχειρήματος.

REST και JSON απόκριση

Εάν δημιουργείτε ένα REST τελικό σημείο και θέλετε να επιστρέψετε το JSON από τη μέθοδο, μπορείτε να σχολιάσετε τη μέθοδο με @ResponseBody. Στη συνέχεια, η απάντηση θα συσκευαστεί αυτόματα ως JSON. Σε αυτήν την περίπτωση θα επιστρέψετε ένα αντικείμενο από τη μέθοδο.

Χρήση MVC με το Spring Web

Παρόμοια με το Struts, το Spring Web module μπορεί εύκολα να χρησιμοποιηθεί για μια πραγματική ρύθμιση μοντέλου-view-controller. Σε αυτήν την περίπτωση, θα επιστρέψετε μια αντιστοίχιση στη δεδομένη γλώσσα templating (όπως το Thymeleaf) και η Spring θα επιλύσει τη χαρτογράφηση, θα παρέχει το μοντέλο που θα περάσετε σε αυτό και θα δώσετε την απόκριση.

Παράδειγμα # 3: Άνοιξη με JDBC

Τώρα ας κάνουμε κάτι πιο ενδιαφέρον με τον διαχειριστή αιτημάτων μας: ας επιστρέψουμε ορισμένα δεδομένα από μια βάση δεδομένων. Για τους σκοπούς αυτού του παραδείγματος, θα χρησιμοποιήσουμε τη βάση δεδομένων H2. Ευτυχώς, το Spring Boot υποστηρίζει το H2 DB στη μνήμη έξω από το κουτί.