Définir des propriétés pour un Printemps contexte
Je suis en utilisant le Printemps pour gérer les appels RMI à une certaine distance du serveur. Il est simple de construire un contexte d'application et d'obtenir les haricots à distance pour les appels à partir du client:
ApplicationContext context = new ApplicationContext("classpath:context.xml");
MyService myService = (MyService ) context.getBean( "myService " );
Cependant je ne vois pas de solution simple pour passer des propriétés dans la configuration. Par exemple si je veux déterminer le nom d'hôte pour le serveur distant lors de l'exécution du client.
J'avais idéalement avoir une entrée dans le Printemps contexte comme celui-ci:
<bean id="myService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://${webServer.host}:80/MyService"/>
<property name="serviceInterface" value="com.foo.MyService"/>
</bean>
et de transmettre les propriétés du contexte du client en tant que paramètre.
Je peux utiliser un PropertyPlaceholderConfigurer dans le contexte de remplacer ces propriétés, mais aussi loin que je peux dire que cela ne fonctionne que pour les propriétés en lecture à partir d'un fichier.
J'ai une application qui répond à ce (ajouté comme une réponse) mais je suis à la recherche d'un standard de Printemps de mise en œuvre pour éviter de rouler mon propre. Est-il une autre Printemps configurer (ou autre chose) pour aider à initialiser la configuration ou suis-je mieux de regarder java config pour y parvenir?
le client peut se connecter à n'importe quel serveur, par exemple, l'utilisateur peut taper le nom d'hôte dans un champ de texte. Donc, il n'est pas déterminée au moment de la compilation.
OriginalL'auteur Rich Seller | 2009-07-06
Vous devez vous connecter pour publier un commentaire.
Mise à jour:
Basé sur la question de mise à jour, ma suggestion est:
ServiceResolver
bean qui gère ce dont vous avez besoin pour gérer en fonction de la rétroaction des clients;La
ServiceResolver
peut alors, soit sur leinit-method
ou à chaque invocation de déterminer les valeurs à retourner au client, basé sur, par exemple, JNDI recherches ou de l'environnement de variables.Mais avant de faire cela, vous voudrez peut-être jeter un oeil à la options de configuration disponibles. Vous pouvez soit:
Si vous avez besoin pour la recherche de propriétés à partir d'un emplacement personnalisé, jetez un oeil à
org.springframework.beans.factory.config.BeanFactoryPostProcessor
et comment leorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer
est mis en œuvre.L'idée de base est que vous obtenez les haricots avec la "brute" des propriétés, par exemple
${jdbcDriverClassName}
et puis vous arrivez à les résoudre et de les remplacer par les valeurs souhaitées.OriginalL'auteur Robert Munteanu
Voir http://forum.springsource.org/showthread.php?t=71815
OriginalL'auteur Bert van Brakel
Ma solution existante implique la définition d'une nouvelle MapAwareApplicationContext qui prend une Carte supplémentaire en argument du constructeur.
Il remplace postProcessBeanFactory() pour ajouter dans un MapAwareProcessor:
La MapAwareProcessor implémente postProcessBeforeInitialization() qui permet d'introduire la carte dans n'importe quel type qui implémente l'MapAware interface:
Je puis ajouter une nouvelle fève de ma config pour déclarer une MapAwarePropertyPlaceholderConfigurer:
Le configurer implémente MapAware, de sorte qu'il sera injecté avec la Carte comme ci-dessus. Il met ensuite en place resolvePlaceholder() pour régler les propriétés de la carte, ou de délégué du parent configurer:
C'est le genre de mon point de vue, il semble comme quelque chose qui devrait être réalisable sans trop d'effort, certainement moins d'effort que ce
Ou vous pourriez utiliser BeanFactoryPostProcessor: springindepth.com/book/...
OriginalL'auteur Rich Seller
PropertyPlaceholderConfigurer pouvez récupérer les propriétés d'un fichier, c'est vrai, mais si on peut pas les trouver, il tombe en arrière à l'aide des propriétés du système. Cela sonne comme une option viable pour votre application cliente, il suffit de passer le système de la propriété grâce à-D lorsque vous lancez le client.
De la javadoc
OriginalL'auteur skaffman
Créer un
RmiProxyFactoryBean
instance et configurer leserviceUrl
propriété directement dans votre code:OriginalL'auteur Chin Huang