JNDI est l'interface de nommage et d'annuaire Java. Il est utilisé pour séparer les préoccupations de l'application développeur et l'application deployer . Lorsque vous écrivez une application qui repose sur une base de données, vous ne devriez pas avoir à vous soucier du nom d'utilisateur ou du mot de passe pour vous connecter à cette base de données. JNDI permet au développeur de donner un nom à une base de données et de s'appuyer sur le déployeur pour mapper ce nom à une instance réelle de la base de données.
Par exemple, si vous écrivez du code qui s'exécute dans un conteneur Java EE, vous pouvez écrire ceci pour obtenir la source de données avec le nom JNDI "Database":
DataSource dataSource =null;try{Context context =newInitialContext();
dataSource =(DataSource) context.lookup("Database");}catch(NamingException e){// Couldn't find the data source: give up}
Notez qu'il n'y a rien ici sur le pilote de base de données, le nom d'utilisateur ou le mot de passe. Cela est configuré à l'intérieur du conteneur.
JNDI n'est pas limité aux bases de données (JDBC); toutes sortes de services peuvent être nommés. Pour plus de détails, vous devriez consulter le didacticiel d'Oracle .
Donc, avec cet exemple en image, en quoi JNDI est-il différent de placer des noms de base de données dans un fichier de configuration xml ou un fichier de propriétés, puis de le lire à partir de là?
Ajay
11
Tout d'abord, vous devez stocker le mot de passe en texte brut dans votre fichier de configuration. Deuxièmement, si vous avez plusieurs applications pointant vers la même base de données et quelque chose sur les changements de configuration de la base de données, vous devez mettre à jour la configuration à plusieurs endroits.
@SimonNickerson Salut !. J'apprends JNDI. C'est une bonne réponse, mais si vous remarquez la question "Comment pouvez-vous réaliser l'utilisation de JNDI?" alors il semble inachevé. Vous avez décrit la réalisation du point de vue du développeur. Qu'en est-il du point de vue du déployeur?
lxknvlk
30
JNDI est un mécanisme très puissant pour à la fois organiser les informations de configuration et découvrir et écouter les services en utilisant le EventContext. Dans JNDI, vous pouvez rechercher et écouter n'importe quel objet (pas seulement DataSources), en supposant que votre fournisseur de services JNDI le prenne en charge.
Bien sûr, le seul problème est d'avoir un fournisseur de services JNDI; ce qui est formidable, c'est qu'il est étonnamment facile de rouler le vôtre. Après tout, vous pouvez encoder n'importe quelle instance Java en XMLutilisant les JavaBeans XMLEncoderet XMLDecoder: vous n'avez pas besoin de vous reposer sur un serveur d'applications!
Alors, quelle est la différence entre cela et avoir des fichiers de configuration? Eh bien, cela peut être beaucoup plus propre car toutes vos applications peuvent obtenir leur configuration au même endroit . S'ils ont besoin de partager des informations de configuration (par exemple, des emplacements de base de données), cela peut être défini une fois dans JNDI . Supposons que vous ayez déplacé des serveurs de base de données: vous n'avez pas besoin de vous souvenir des fichiers de configuration de gazillion avec leur emplacement. Vous allez juste au seul endroit: JNDI.
C'est de loin la clarification la plus complète - Merci oxbow_lakes! Btw, auriez-vous des pointeurs de code où une instance Java a été encodée comme vous le suggérez?
Rohan Kumar
13
JNDI est une API utilisée pour accéder à l'annuaire et aux services de nommage (c'est-à-dire les moyens par lesquels les noms sont associés aux objets). L'association d'un nom avec un objet s'appelle une liaison.
Un exemple de base de service de dénomination est le DNS qui mappe les noms de machine aux adresses IP.
À l'aide de JNDI, les applications peuvent stocker et récupérer des objets Java nommés de tout type.
Dans le contexte de java, cela peut être utilisé dans des fichiers de configuration où vous ne voulez pas coder en dur des variables spécifiques à l'environnement.
JNDI permet la simplification d'une construction de ressource en un simple nom . Donc, c'est beaucoup de détails regroupés en 1 pour plus de commodité / sécurité / etc. (aka couche d'abstraction)
à réaliser:
configurez une liste de propriétés qui correspond aux champs prédéfinis dans l'interface de contexte Jndi. (ces propriétés spécifient les paramètres pour l'exécution jndi; mais * pas le nom de la recherche)
Properties props =newProperties();//field Context.INITIAL_CONTEXT_FACTORY => property name java.naming.factory.initial//field Context.PROVIDER_URL => property name java.naming.provider.url
props.load(newFileInputStream("*properties file*"));//prop file in this caseContext ctx =newInitialContext(props);Object o = ctx.lookup("*name of resource*");
idéalement, une fonction spécialisée existerait pour maintenir un annuaire LDAP, un DNS, etc. dans votre organisation (donc un ensemble de mappage unique unifié dessert tous, réduisant les écarts)
Réponses:
JNDI est l'interface de nommage et d'annuaire Java. Il est utilisé pour séparer les préoccupations de l'application développeur et l'application deployer . Lorsque vous écrivez une application qui repose sur une base de données, vous ne devriez pas avoir à vous soucier du nom d'utilisateur ou du mot de passe pour vous connecter à cette base de données. JNDI permet au développeur de donner un nom à une base de données et de s'appuyer sur le déployeur pour mapper ce nom à une instance réelle de la base de données.
Par exemple, si vous écrivez du code qui s'exécute dans un conteneur Java EE, vous pouvez écrire ceci pour obtenir la source de données avec le nom JNDI "Database":
Notez qu'il n'y a rien ici sur le pilote de base de données, le nom d'utilisateur ou le mot de passe. Cela est configuré à l'intérieur du conteneur.
JNDI n'est pas limité aux bases de données (JDBC); toutes sortes de services peuvent être nommés. Pour plus de détails, vous devriez consulter le didacticiel d'Oracle .
la source
JNDI est un mécanisme très puissant pour à la fois organiser les informations de configuration et découvrir et écouter les services en utilisant le
EventContext
. Dans JNDI, vous pouvez rechercher et écouter n'importe quel objet (pas seulementDataSource
s), en supposant que votre fournisseur de services JNDI le prenne en charge.Bien sûr, le seul problème est d'avoir un fournisseur de services JNDI; ce qui est formidable, c'est qu'il est étonnamment facile de rouler le vôtre. Après tout, vous pouvez encoder n'importe quelle instance Java en
XML
utilisant les JavaBeansXMLEncoder
etXMLDecoder
: vous n'avez pas besoin de vous reposer sur un serveur d'applications!Alors, quelle est la différence entre cela et avoir des fichiers de configuration? Eh bien, cela peut être beaucoup plus propre car toutes vos applications peuvent obtenir leur configuration au même endroit . S'ils ont besoin de partager des informations de configuration (par exemple, des emplacements de base de données), cela peut être défini une fois dans JNDI . Supposons que vous ayez déplacé des serveurs de base de données: vous n'avez pas besoin de vous souvenir des fichiers de configuration de gazillion avec leur emplacement. Vous allez juste au seul endroit: JNDI.
la source
JNDI est une API utilisée pour accéder à l'annuaire et aux services de nommage (c'est-à-dire les moyens par lesquels les noms sont associés aux objets). L'association d'un nom avec un objet s'appelle une liaison.
Un exemple de base de service de dénomination est le DNS qui mappe les noms de machine aux adresses IP.
À l'aide de JNDI, les applications peuvent stocker et récupérer des objets Java nommés de tout type.
Dans le contexte de java, cela peut être utilisé dans des fichiers de configuration où vous ne voulez pas coder en dur des variables spécifiques à l'environnement.
Exemple de printemps:
Fichier de contexte Spring
Fichier de contexte Tomcat
la source
JNDI permet la simplification d'une construction de ressource en un simple nom . Donc, c'est beaucoup de détails regroupés en 1 pour plus de commodité / sécurité / etc. (aka couche d'abstraction)
à réaliser: configurez une liste de propriétés qui correspond aux champs prédéfinis dans l'interface de contexte Jndi. (ces propriétés spécifient les paramètres pour l'exécution jndi; mais * pas le nom de la recherche)
idéalement, une fonction spécialisée existerait pour maintenir un annuaire LDAP, un DNS, etc. dans votre organisation (donc un ensemble de mappage unique unifié dessert tous, réduisant les écarts)
Liste des fournisseurs de services JNDI: https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm
la source