Une visite à pied de JavaBeans

Précédent 1 2 Page 2 Page 2 de 2

Qu'est-ce que JavaBeans et ce qu'il fait

JavaBeans n'est pas un produit, un programme ou un environnement de développement. Il s'agit à la fois d'un package Java principal ( java.beans) que Beans peut utiliser pour fournir des fonctionnalités étendues et d'un document (la spécification JavaBeans ) qui décrit comment utiliser les classes et les interfaces du java.beanspackage pour implémenter la «fonctionnalité Beans». La spécification de classe fait partie de la version de base de Java 1.1, et aucun logiciel supplémentaire ne doit donc être installé pour pouvoir l'utiliser. L'ajout de Beans n'a nécessité que peu de modifications du langage Java en soi, bien que plusieurs API nouvelles et indispensables aient été ajoutées à la version principale pour prendre en charge les fonctionnalités de Beans. La lecture du cahier des charges peut être informative mais soporifique. Heureusement, c'est facultatif si vous comprenez déjà comment et pourquoi utiliser le package JavaBeans. Peut-être que vous comprenez déjà Beans en lisant une série d'articles divertissants et instructifs sur JavaBeans dans JavaWorld , par exemple.

JavaBeans transforme les classes en composants logiciels en fournissant plusieurs nouvelles fonctionnalités. Certaines de ces fonctionnalités sont spécifiques aux Beans. D'autres, comme la sérialisation, peuvent s'appliquer à n'importe quelle classe, Bean ou autre, mais sont cruciales pour la compréhension et l'utilisation de Beans.

Les composants logiciels ont des propriétés , qui sont des attributs de l'objet. La personnalisation est le processus de configuration d'un Bean pour une tâche particulière. Le nouveau schéma de gestion des événements dans Java 1.1 a été créé en partie pour faciliter la communication entre Beans. Les haricots peuvent être disséqués par les IDE ou par d'autres classes via un processus appelé introspection . Les Beans peuvent être persistants (c'est-à-dire sérialisés ) dans des flux d'octets pour la transmission ou le stockage, et les Beans persistants peuvent être emballés dans des "fichiers JAR" pour faciliter le téléchargement et l'accès. Enfin, Beans a été conçu pour interopérer facilement avec les technologies de composants héritées telles que ActiveX et LiveConnect, et participez aux transactions avec les systèmes Object Request Broker tels que CORBA.

Examinons chacune de ces capacités un peu plus en profondeur.

Propriétés et personnalisation

Les propriétés, comme indiqué ci-dessus, sont des attributs d'un Bean. Les propriétés visuelles peuvent inclure la couleur ou la taille de l'écran. D'autres propriétés peuvent ne pas avoir de représentation visuelle: un Bean BrowserHistory, par exemple, peut avoir une propriété spécifiant le nombre maximal d'URL à stocker. Les beans exposent les méthodes setter et getter (appelées "méthodes accesseurs") pour leurs propriétés, permettant à d'autres classes ou IDE de manipuler leur état. Le processus de configuration des propriétés d'un Bean au moment de la conception ou de l'exécution est appelé personnalisation .

Le développeur a beaucoup de contrôle sur l'accès et la modification des propriétés de Beans. Pour une propriété simple , le développeur écrit une méthode appelée setProperty()et une autre appelée getProperty().

Ici, vous auriez vu une applet, mais pour une raison quelconque, vous ne pouvez pas.

Diagramme à bandes

Par exemple, si vous utilisez un navigateur compatible Java, vous verrez à gauche une applet qui utilise une petite classe appelée BarChart. Le BarChartest la barre colorée entre les deux boutons. BarChartIl ne manque qu'une seule chose pour devenir un Bean: il n'implémente pas l'interface java.io.Serializable(car la plupart des navigateurs ne gèrent pas encore Java 1.1, et donc l'applet d'exemple échouerait.)

À l'exception du fait d'être sérialisable, BarChartest un simple Bean, avec seulement quelques méthodes. Il a void setPercent(int pct), qui inonde le fond pct pour cent de la barre de rouge. La méthode int getPercent()renvoie le pourcentage actuel stocké dans le Bean (c'est l'état du Bean). La setPercent()méthode appelle également repaint()si elle a changé le pourcentage, afin que la représentation visuelle de l'objet reste à jour.

Le code de l'applet appelle setPercent(getPercent()+10)lorsque l'utilisateur clique sur le bouton + 10% , ce qui entraîne l' BarChartincrémentation de son pourcentage (s'il est <100%). Percent est un exemple de propriété Bean , avec des méthodes setter et getter nommées conformément à la spécification JavaBeans. Au fur et à mesure que cette série se poursuivra, nous transformerons cet humble petit BarCharten un composant logiciel utile qui peut être branché dans une variété d'applications.

La valeur d'une propriété indexée est un tableau. Les méthodes d'accesseur des propriétés indexées reçoivent et renvoient des tableaux de valeurs au lieu de scalaires. Les méthodes d'accès peuvent lever des exceptions vérifiées pour signaler des conditions d'erreur.

Parfois, il est utile qu'une action se produise lorsqu'une certaine propriété d'un objet change. Les propriétés liées entraînent l'envoi d'événements à d'autres objets lorsque la valeur de la propriété change, ce qui permet éventuellement au récepteur de prendre des mesures. Ainsi, un SpreadSheet Bean peut être configuré pour indiquer à un PieChart Bean de se redessiner chaque fois que les données de la feuille de calcul changent.

Souvent, certaines valeurs de propriétés sont illégales, en fonction de l'état d'autres Beans. Un Bean peut être configuré pour "écouter" ces propriétés contraintes d'autres Beans, et "veto" les changements qu'il n'aime pas. Par exemple, le ControlRodArray Bean d'un réacteur nucléaire peut vouloir interférer avec quelqu'un qui tente de changer l'état d'un DrainReactorCorePump Bean sur ON si les barres de commande sont retirées. (Ne pas essayer à la maison. Probablement personne ne devraient utiliser JavaBeans pour de telles applications juste encore.)

Lorsqu'un développeur connecte des Beans ensemble pour créer une application, l'EDI peut présenter une feuille de propriétés contenant toutes les propriétés des Beans et leurs valeurs actuelles. (Une feuille de propriétés est une boîte de dialogue utilisée pour définir et / ou afficher les propriétés, comme ce que vous obtenez en sélectionnant Options… dans un menu.) Le développeur définit les propriétés graphiquement, ce que l'EDI traduit en appels aux méthodes de définition des Beans, changer l'état des haricots. Cela personnalise les Beans pour l'application particulière.

L'utilisation de listes de propriétés n'est pas toujours la meilleure façon de gérer la personnalisation de Beans. Certains Beans ont un état trop complexe pour être facilement manipulé de cette manière. D'autres Beans seraient simplement plus cool s'il y avait une manière plus intuitive de les configurer. Imaginez le pauvre gestionnaire qui veut simplement consulter les rapports de ventes et doit trouver ce qu'il faut taper dans la zone de texte "Source de données ODBC distante" d'une feuille de propriétés. Ne serait-il pas plus cool si elle pouvait simplement faire glisser et déposer l'icône d'un DataSource Bean (personnalisé avec l'étiquette "Sales Data", bien sûr) sur un DataConnection Bean, le configurant ainsi automatiquement? Un développeur Beans peut incorporer une feuille de propriétés dans le Bean lui-même, et l'EDI utilise alors ce "personnalisateur" pour personnaliser le Bean.

Les classes pertinentes pour la manipulation des propriétés et la personnalisation se trouvent dans le java.beanspackage.

Gestion des événements

Toute cette interaction entre les haricots suppose un moyen pour eux de communiquer. JDK 1.1 définit un nouveau modèle d'événement que les classes (pas seulement les Beans!) Utilisent pour communiquer. En fait, ce nouveau modèle d'événement a trouvé sa place dans l' un des plus paquets largement utilisé de Java: java.awt!

Dans le nouveau modèle d'événement, une classe enregistre l'intérêt pour les activités d'une autre classe au moyen d'une interface d'écoute . En effet, l' objet cible (la partie intéressée) dit à l' objet source (l'objet d'intérêt), "Faites-moi savoir chaque fois que tel ou tel se produit." Lorsque tel ou tel se produit, l'objet source "déclenche" un événement sur la cible en invoquant le gestionnaire d'événements de la cible avec une sous-classe de EventObjectcomme argument.

Les événements peuvent être utilisés pour implémenter des propriétés liées et contraintes. Dans l'exemple PieChart et SpreadSheet ci-dessus, le PieChart «enregistre» l'intérêt pour toute modification apportée à la propriété DataList (disons) de SpreadSheet . Lorsque le SpreadSheet va modifier sa propriété DataList , il transmet un DataListChangedEvent(sous- classé de EventObject), indiquant ce qui a changé, à la méthode de gestionnaire d'événements de chaque auditeur intéressé. La cible ( PieChart) examine ensuite l'événement et prend les mesures appropriées.

L'exemple du réacteur nucléaire fonctionne de la même manière; mais dans ce cas, la cible annule le changement en lançant une exception. Ainsi, le monde est sauvé de la destruction radioactive généralisée.

La EventObjectclasse peut être étendue pour créer des événements définis par l'utilisateur . Les classes peuvent désormais définir et utiliser de nouveaux types d'événements pour s'envoyer des messages. Cela signifie que les Beans exécutés dans le même conteneur peuvent communiquer en passant des messages. Cela aide à découpler les dépendances entre les objets, ce que nous savons être une très bonne chose.

Les événements définis par l'utilisateur (et autres) sont dérivés de la classe java.util.EventObject.

Introspection

Le terme plutôt étrange introspection est Java-speak pour le processus d'analyse programmatique des méthodes publiques et des membres d'une classe. Ce processus est également parfois appelé découverte . Le nouveau mécanisme de réflexion dans le noyau Java, qui peut disséquer un objet et renvoyer une description de son contenu, rend l'introspection possible. (Bien que Java puisse être réfléchi, voire introspectif, l'omphaloskepsis ne fait toujours pas partie de la distribution principale.)

Nous avons déjà rencontré une application de cette capacité. Ci-dessus, nous avons décrit un IDE qui pourrait construire une liste de propriétés Bean à présenter à un développeur. Comment l'EDI peut-il connaître les propriétés d'un Bean? L'EDI découvre les propriétés d'un Bean de deux manières: en demandant au Bean une description de ses propriétés, ou en disséquant le Bean en l'introspectant.

Un IDE typique commencera par demander à un Bean un objet BeanInfo, qui décrit entre autres les propriétés du Bean. L'EDI utilisera ensuite l'objet BeanInfo pour construire une feuille de propriétés. (Cela suppose que le Bean ne fournit pas de personnalisateur.) Si le Bean ne sait pas comment renvoyer un objet BeanInfo, l'EDI introspecte alors le Bean et scanne la liste des méthodes pour les noms commençant par set et obtenir . Il suppose (par convention) que ces méthodes sont des accesseurs pour les propriétés et crée une nouvelle feuille de propriétés basée sur les méthodes d'accesseur existantes et les types d'arguments que ces méthodes prennent. Donc, si les méthodes IDE de trouvailles aiment setColor(Color), Color getColor(), setSize(Size)et Size getSize(), il va créer une feuille de propriétés avec les propriétésCouleur et taille , et widgets correctement typés pour les définir.

Cela signifie que si un développeur suit simplement les conventions de dénomination des méthodes d'accès, un IDE peut déterminer automatiquement comment créer une feuille de propriétés de personnalisation pour le composant.

Le mécanisme de réflexion qui effectue l'introspection se trouve dans le nouveau package principal du langage java.lang.reflect.

Persistance et emballage

Il est souvent utile de «lyophiliser» un objet en convertissant son état en une masse de données à emballer pour une utilisation ultérieure - ou à transmettre via un réseau pour être traité ailleurs. Ce processus est appelé sérialisation et est une nouvelle fonctionnalité du noyau Java.

L'une des utilisations les plus simples de la sérialisation consiste à enregistrer l'état d'un Bean personnalisé, de sorte que les propriétés d'un Bean nouvellement construit puissent être correctement définies au moment de l'exécution.

En outre, la sérialisation est un pilier de la technologie des composants, rendant possible des schémas de traitement distribué tels que CORBA. Si un objet ne dispose pas localement des informations dont il a besoin pour effectuer sa tâche, il peut s'envoyer à un Request Broker, qui sérialise l'objet et l'envoie ailleurs pour traitement. Du côté distant, l'objet est reconstitué et l'opération demandée à l'origine est effectuée. C'est aussi un moyen de réaliser l'équilibrage de charge (pour les tâches coûteuses, c'est-à-dire: la sérialisation et la désérialisation ne sont souvent pas bon marché).

Où conservez-vous un groupe de haricots lyophilisés qui ont été «marinés» de cette manière? Pourquoi, dans un JAR, bien sûr! La spécification JavaBeans décrit un fichier JAR comme un fichier ZIP structuré contenant plusieurs objets sérialisés, de la documentation, des images, des fichiers de classe, etc., avec un manifeste qui décrit le contenu du JAR. Un fichier JAR, contenant de nombreux petits fichiers compressés, peut être téléchargé en un seul morceau et décompressé côté client, ce qui rend le téléchargement d'applet (par exemple) plus efficace. (JAR est de toute évidence un jeu sur le format de fichier tar Unix .)

Le java.iopackage fournit la sérialisation des objets. La spécification JavaBeans décrit le format des fichiers JAR.

Interopérabilité

Certains ont dit un jour que ce qui est bien avec les normes, c'est qu'il y en a tellement de choix. Les technologies des composants ne font pas exception. Il existe de nombreux systèmes existants basés sur OLE (ou sa dernière incarnation, ActiveX), OpenDoc et LiveConnect. JavaBeans a été conçu pour (au moins éventuellement) interopérer avec ces autres technologies de composants.

Il n'est pas réaliste de s'attendre à ce que les développeurs abandonnent les investissements existants dans d'autres technologies et réimplémentent tout en Java. Depuis la sortie de Java 1.1, les premiers kits "bridge" Beans / ActiveX sont devenus disponibles, permettant aux développeurs de lier les composants Beans et ActiveX de manière transparente dans la même application. L'interface Java IDL, qui permettra aux classes Java de fonctionner avec les systèmes CORBA existants, doit sortir cette année.

Bien que le pont Beans / ActiveX et l'IDL Java ne fassent pas partie de la distribution standard de JavaBeans, ils complètent les capacités de JavaBeans en tant que technologie ouverte de puissance industrielle pour les logiciels de composants portables.

Conclusion

Nous avons couvert beaucoup de terrain. Dans cet article, vous avez appris ce que sont les composants logiciels et pourquoi ils sont précieux. Vous avez ensuite découvert les différentes propriétés des JavaBeans, notamment les propriétés, la personnalisation, les événements, l'introspection, la persistance, l'empaquetage et l'interopérabilité avec les systèmes de composants hérités.

Dans le prochain article de cette série, nous vous ferons commencer à utiliser les JavaBeans et examinerons en détail les propriétés des Bean: comment elles fonctionnent et comment rendre vos Beans personnalisables. Au fur et à mesure, nous discuterons des nouvelles fonctionnalités de base de Java qui rendent Beans possible. Les prochains articles de cette série approfondiront les détails des sujets dont nous avons discuté ce mois-ci.

Mark Johnson est titulaire d'un BS en génie informatique et électrique de l'Université Purdue (1986). Il a 15 ans d'expérience en programmation en C et deux ans en C ++, et est un passionné de l'approche Design Pattern en architecture orientée objet, des composants logiciels en théorie et des JavaBeans en pratique. Au cours des dernières années, il a travaillé pour Kodak, Booz-Allen et Hamilton et EDS à Mexico, développant des applications de base de données Oracle et Informix pour l'Institut fédéral électoral mexicain et pour les douanes mexicaines. Il a passé l'année dernière à travailler chez NETdelivery, une startup Internet maintenant à Boulder, CO. et des back-ends d'entreprise évolutifs.Il travaille actuellement en tant que concepteur et développeur pour Object Products à Fort Collins, CO.

En savoir plus sur ce sujet

  • Une excellente comparaison entre JavaBeans et ActiveX peut être trouvée dans l' article de couverture JavaWorld de Merlin Hughes , "JavaBeans et ActiveX vont de pair"

    //www.javaworld.com/javaworld/jw-03-1997/jw-03-avb-tech.html

  • Sun Microsystems gère un site Web pour JavaBeans. Sur ce site, vous pouvez télécharger le dernier BDK (Beans Developer's Kit), lire la spécification JavaBeans, parcourir un tutoriel en ligne et découvrir les dernières informations sur Beans. //java.sun.com/beans
  • Le conseiller JavaBeans , un bulletin électronique occasionnel contenant des nouvelles de Beans et des conseils de développeur, est archivé à

    //splash.javasoft.com/beans/Advisor.html

  • La FAQ JavaBeans maintenue par Sun est à

    //splash.javasoft.com/beans/FAQ.html

  • Enfin, l' omphaloskepsis est une forme de méditation introspective impliquant une intense contemplation du nombril. Consultez le site Web Word A Day et remplissez votre discours quotidien de références obscures! //www.wordsmith.org/awad/index.html

Cette histoire, "Une visite à pied de JavaBeans" a été initialement publiée par JavaWorld.