Comment AutoWire un objet sans Ressort XML fichier de contexte?
J'ai une Interface avec Component
d'annotation et de certaines classes qui l'ont mis en œuvre comme suit:
@Component
public interface A {
}
public class B implements A {
}
public class C implements A {
}
Aussi, j'ai une classe avec un Autowired
variable comme ceci:
public class Collector {
@Autowired
private Collection<A> objects;
public Collection<A> getObjects() {
return objects;
}
}
Mon fichier de contexte se compose de ces définitions:
<context:component-scan base-package="org.iust.ce.me"></context:component-scan>
<bean id="objectCollector" class="org.iust.ce.me.Collector" autowire="byType"/>
<bean id="b" class="org.iust.ce.me.B"></bean>
<bean id="c" class="org.iust.ce.me.C"></bean>
Et dans la classe principale, j'ai quelques codes comme suit:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
B b = (B) context.getBean("b");
C c = (C) context.getBean("c");
Collector objectCollector = (Collector) context.getBean("objectCollector");
for (A object : objectCollector.getObjects()) {
System.out.println(object);
}
De sortie:
org.iust.ce.me.B@1142196
org.iust.ce.me.C@a9255c
Ces codes fonctionnent bien, mais pour certaines raisons, je ne suis pas prêt à utiliser xml fichier de contexte. En dehors de cela, je préfère créer les objets avec le new
opérateur plutôt que d'utiliser le getBean()
méthode. Néanmoins, depuis la AutoWiring
est vraiment une bonne idée dans la programmation, je ne veux pas le perdre.
Maintenant, j'ai deux questions!!
- comment puis-je
AutoWire
classes qui implémente l'A
Interface sans utiliser le xml fichier de contexte?
Est-il possible? - lorsque je change la
scope
d'un haricot de lasinglton
à
prototype
comme suit:<bean id="b" class="org.iust.ce.me.B" scope="prototype"></bean>
et d'instancier plusieurs haricots, seul le haricot qui a été instancié lors de la création de
context
, estinjected
enAutoWired
variable. Pourquoi?
Toute aide sera appréciée.
OriginalL'auteur faghani | 2012-10-08
Vous devez vous connecter pour publier un commentaire.
Pas sûr de la version de Printemps que vous utilisez. Mais actuellement, vous pouvez utiliser
@Configuration
à remplacer .xml. Jetez un oeil à @ConfigurationCi-dessous est le code dans la documentation
OriginalL'auteur Willy
Fourni les classes être gérés ont été correctement annoté, le Printemps peut analyser l'application, les fichiers pour obtenir les informations dont il a besoin, sans xml ou java fichiers de configuration.
Note
AnnotationConfigApplicationContext
est instancié sans aucun argument.context.scan("...");
prend une chaîne de caractères qui indique le Printemps où chercher. paquetsseront analysés, et les classes à l'intérieur de ces paquets annoté avec
@Component
,@Autowired
, etc. sera instatiated et injecté en cas de besoin.Cette approche ne semble pas à être bien documentés.
OriginalL'auteur marcus
1 - Vous devez écrire une autre classe qui va faire l'opération. écrire @Composante de B et de classe C.
avec cela, vous obtiendrez B et C, sans l'aide de xml.
2- http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html Bean étendues sont détaillées mentionnées ici. Si vous voulez toujours un nouvel objet, vous devez utiliser un prototype, mais la création d'un nouveau sera fait dans les différentes classes. Dans la même classe, vous devez ajouter une nouvelle référence.
comme
A
Interface ajoutés manuellement àInitClass
. Dans mon projet il y a plusieurs classes qui ont mis en œuvreA
Interface et je ne veux pas manuellement les gérer.Vous devez initialiser le xml au démarrage une fois d'utiliser le Printemps le premier Objet que vous allez accéder à partir de la méthode main doit se faire avec le contexte.getBean les autres seront injectés si @Autocâblés existe. Dynamique de création de nouveaux objets, vous devez utiliser contexte.getBean, je pense qu'il n'y a aucun autre moyen de printemps.
Je pense que la création du Printemps des haricots avec
new
opérateur est possible, mais je ne sais pas comment il peut être fait. Un coup d'œil à cette questionÀ cette question, il est aussi une réponse, vous devez utiliser des AOP et compiler vos projets avec maven ou ant. Je ne l'ai pas fait avant peut-être que vous devriez regarder pour le lien static.springsource.org/spring/docs/current/... et eclipse.org/aspectj/doc/released/devguide/ltw.html
OriginalL'auteur sgpalit