Πρόσθετες λειτουργίες και δέσμες

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

Πρόσθετη λειτουργία

Η κλάση Πρόσθετη λειτουργία αντιπροσωπεύει μια πρόσθετη λειτουργία η οποία εκτελείται στην πλατφόρμα. Είναι μια βολική θέση για τη συγκέντρωση των παραμέτρων του κύκλου ζωής και της συνολικής σημασιολογίας μιας πρόσθετης λειτουργίας. Μια πρόσθετη λειτουργία μπορεί να υλοποιήσει εξειδικευμένες συναρτήσεις για τις παραμέτρους start και stop του κύκλου ζωής της. Κάθε μέθοδος κύκλου ζωής περιλαμβάνει παραπομπή σε μια κλάση BundleContext που παρέχει επιπλέον πληροφορίες.

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

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

Περιβάλλον δέσμης

Η διαχείριση του κύκλου ζωής είναι το σημείο όπου συναντώνται ο όρος "δέσμη" OSGi και ο όρος "πρόσθετη λειτουργία" της πλατφόρμας. Όταν εκκινείται η πρόσθετη λειτουργία σας, αποδίδεται σε αυτήν μια παραπομπή στην κλάση BundleContext από την οποία μπορεί να αποκτήσει πληροφορίες σχετικά με την πρόσθετη λειτουργία. Η κλάση BundleContext μπορεί επίσης να χρησιμοποιηθεί για να λάβετε πληροφορίες σχετικά με άλλες πρόσθετες λειτουργίες/δέσμες του συστήματος.

Η μέθοδος BundleContext.getBundles() μπορεί να εφαρμοστεί για την απόκτηση ενός πίνακα με όλες τις δέσμες στο σύστημα. Οι λειτουργίες ακρόασης για την κλάση BundleEvent μπορούν να καταχωρηθούν έτσι ώστε η πρόσθετη λειτουργία σας να γνωρίζει πότε υπάρχουν αλλαγές στην κατάσταση του κύκλου ζωής κάποιας άλλης δέσμης. Δείτε το javadoc για την κλάση BundleContext και την κλάση BundleEvent για περισσότερες πληροφορίες.

Πριν από την έκδοση 3.0, διατίθετο ένα μητρώο πρόσθετης λειτουργίας (IPluginRegistry) για την παροχή παρόμοιων πληροφοριών. Για παράδειγμα, μπορούσατε να υποβάλλετε ερώτημα για τις λειτουργίες περιγραφής όλων των πρόσθετων λειτουργιών στο σύστημα. Αυτό το μητρώο έχει τώρα καταργηθεί και θα πρέπει να χρησιμοποιείτε την κλάση BundleContext για αυτόν το σκοπό. Το μητρώο της πλατφόρμας χρησιμοποιείται πλέον αποκλειστικά για πληροφορίες σχετικά με επεκτάσεις και σημεία επέκτασης.

Ενεργοποιητές δέσμης

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

Δέσμες

Κάτω από κάθε πρόσθετη λειτουργία βρίσκεται μια δέσμη OSGi η διαχείριση της οποίας γίνεται από το πλαίσιο. Η κλάση Bundle είναι η μονάδα OSGi της τμηματικής διάρθρωσης. Βασικά, μια δέσμη είναι απλά μια συλλογή αρχείων (πόρων και κώδικα) τα οποία βρίσκονται εγκατεστημένα στην πλατφόρμα. Κάθε δέσμη έχει το δικό της φορτωτή κλάσεων Java και περιλαμβάνει πρωτόκολλο για μια εκτελούμενη από την ίδια εκκίνηση, έναρξη και κατάργηση εγκατάστασης. Από την άποψη της πλατφόρμας Eclipse, μια Δέσμη είναι απλά μια κλάση υλοποίησης. Οι προγραμματιστές πρόσθετων λειτουργιών δεν επεκτείνουν την κλάση της δέσμης, αλλά χρησιμοποιούν την κλάση Plugin ή άλλες υλοποιήσεις BundleActivator για την απεικόνιση της πρόσθετης λειτουργίας.