12
votes

Comment modifier les haricots définis dans un conteneur à ressort

J'ai deux fichiers XML définissant des haricots pour le Springframework (version 2.5.x): xxx

... et xxx

Maintenant, je veux ajuster la propriété SourceCodelocations de haricot codebase dans conteneurspecial.xml . Je dois ajouter une deuxième valeur src / généré / productif .

une approche simple est de remplacer la définition de codebase dans conteneurspecial.xml et ajoutez les deux valeurs, celui de conteneurbase.xml et le nouveau: xxx

Y a-t-il un moyen d'étendre la liste sans redéfinir le haricot?

edit 2009-10-06:

Le but Il s'agit d'un conteneur standard partagé conteneurbase utilisé par de nombreux projets différents. Chaque projet peut remplacer / étendre certaines propriétés spéciales pour ce projet dans son propre ContenersPecial . Si le projet ne remplace pas, il utilise les valeurs par défaut définies dans conteneurbase .


0 commentaires

5 Réponses :


3
votes

Oui. Une définition de haricot peut avoir un attribut «parent» qui fait référence à une définition de haricot mère. La nouvelle définition "enfant" hérite la plupart des propriétés du parent et de toutes ces propriétés peuvent être remplacées.

voir Définition des haricots Héritage

Aussi vous pouvez utiliser Collection Fusion pour fusionner la définition de la propriété de liste des définitions de base des parents et des enfants. De cette façon, vous pouvez spécifier des éléments de liste dans la définition de haricot de la mère et ajouter plus d'articles à la définition de haricot d'enfant.


5 commentaires

Mais alors il y a deux haricots. "codebase" et celui de "conteneurspecial.xml". De l'application, je veux seulement trouver un haricot. Et je ne veux pas faire le haricot "codebase" dans "conteneurbase.xml" résumé, car il est nécessaire d'ailleurs.


Vous n'avez pas besoin de nommer les deux haricots "codebase", ils peuvent avoir des noms uniques. De plus, vous n'avez pas besoin de rendre le résumé de la haricot mère qui n'est pas une exigence, seule une option.


A la façon dont vous avez également besoin de rechercher «Collection-fusion». Il résout le problème de nécessiter de ré-spécifier des éléments de collecte déjà spécifiés dans la définition de haricot mère.


Mais alors j'ai encore deux haricots de classe "com.example.codebase". Mon application appelle xmlbeanfactory.getbeansoftype (codebase.class). Donc, je veux vraiment avoir un seul haricot.


Dans ce cas, utilisez le mot clé abstrait sur la haricot mère comme suggéré dans l'exemple de référence; Les définitions de haricots marqués abstraites ne seront pas retournées par GetBeansofType. Vous avez dit dans votre premier commentaire que la définition de la haricot mère (qui serait désormais abstraite) est nécessaire de quelque part d'ailleurs, ce qui est correct car être abstrait ne désactive pas qu'il est utilisé que c'est l'instanciation. Ainsi, partout où il y a besoin ailleurs, vous pouvez faire une nouvelle définition d'enfant qui n'est pas non plus abstraite.



1
votes

3 approches:

  1. simple: avoir deux répertoriennes defaultCoDeLocations et d'entaminesTourcodélocations et que vos méthodes d'accesseur vérifient les deux (ou les combiner). J'ai vu cela dans certains cadres - une liste par défaut des gestionnaires est remplie, puis des utilisateurs supplémentaires créés sont ajoutés ...

  2. plus compliqué mais garde la classe d'origine propre: vous pouvez alors créer une classe de codeBasemodifier. Cela aurait une méthode init pour modifier une instance injectée du haricot. XXX

    Si vous vouliez faire cela vraiment générique, vous pouvez créer un modificateur de haricot qui le ferait par réflexion. Faites attention à la commande si vous utilisez cette approche. Les haricots dépendants de la base de code devraient s'assurer que cette classe a été instanciée d'abord (avec dépend)

    3 une variation sur 2 ... Au lieu de créer directement une classe de code Code créer une usine qui retourne un haricot peuplé . Cette usine pourrait ensuite être configurée avec le ressort de la même manière que celle de la même manière à 2. Demandez à une valeur par défautCOrcOrocodélocations et en outreAnsCoDelocations

    Sauf si vous avez besoin de nombreuses propriétés extensibles, j'irais avec l'option 1.


0 commentaires

1
votes

Y a-t-il un moyen de définir la liste dans une propriété ou une autre configuration avant la main?

Il semble que la configuration de l'application et le câblage sont étroitement couplés. De mon expérience, s'il est difficile de faire quelque chose au printemps, il existe probablement un moyen plus facile de le faire.


2 commentaires

Je suis libre faites-le le meilleur moyen. Avez-vous une idée?


Les fichiers de propriétés sont une configuration système simple et peuvent être injectées dans des haricots à ressort via des objets de propriétés. Je les ai utilisés pour des propriétés similaires par défaut / conteneur. Pour obtenir la prise en charge de la liste, déléguez une méthode pour analyser la liste de l'objet Propriétés. config.default.properties --------------------------------------------------- SRC / SRC / Source productive.Locations.2 = SRC / Fait à la main / productif1 Config.Container.Properties --------------------------- Source.Locations.1 = SRC / Conteneur / Productive Source.Locations .2 = src / conteneur / productif1



10
votes

Vous pouvez utiliser un BeansFactoryPostProcesseur Pour changer les métadonnées du haricot avant que le conteneur à ressort instancite de la bean de codeBase. Par exemple:

<beans>
    <import resource="context1.xml" />

    <bean class="com.example.CodebaseOverrider">
        <property name="sourceCodeLocations">
            <list>
                <value>src/handmade/productive</value>
                <value>src/generated/productive</value>
            </list>
        </property>
    </bean>
</beans>


1 commentaires

CodeBaseverrider n'est pas tout à fait ce que je recherche, mais avec cette approche, je pouvais écrire facilement un codeBaselistextender facilement. Je vais l'essayer.



1
votes

dans le printemps 3.0, vous pouvez spécifier fusion = "true" sur la balise "Liste". Voir http://forum.springsource.org/archive/index.php/ T-97501.html pour plus de détails.


0 commentaires