printemps @Autowire propriété vs setter
Quelle est la différence entre anotate @Autocâblés à un bien ou à le faire dans l'incubateur?
Autant que je sache, ils ont tous les deux le même résultat, mais il n'existe aucune raison d'utiliser l'un plutôt que l'autre?
Mise à JOUR (pour être plus concis)
Est-il une différence entre ce
package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Autowired;
public class TextEditor {
private SpellChecker spellChecker;
@Autowired
public void setSpellChecker( SpellChecker spellChecker ){
this.spellChecker = spellChecker;
}
public void spellCheck() {
spellChecker.checkSpelling();
}
}
et ce
package com.tutorialspoint;
import org.springframework.beans.factory.annotation.Autowired;
public class TextEditor {
@Autowired
private SpellChecker spellChecker;
public TextEditor() {
System.out.println("Inside TextEditor constructor." );
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}
- Je ne sais pas pourquoi les réponses à cette question serait d'opinions. Je veux savoir si il y a une différence pratique entre l'utilisation de @Autocâblés dans un setter ou directement dans la propriété. Ne demande pas lequel est le mieux, simplement si il y a une différence
Vous devez vous connecter pour publier un commentaire.
Avec
@Autowired
d'annotation, vous n'avez pas besoin d'une méthode de définition. Une fois votre bean constructeur se fait par l'attribution/la création de l'objet, le Printemps de numérisation pour cette annotation et permettrait d'injecter les instances de l'objet que vous avez annoté.Alors que si vous avez setter et si vous êtes toujours à l'aide de xml de config, vous définissez explicitement les propriétés.
Après avoir dit que, Vous pouvez annoter votre constructeur et de la méthode de définition avec autocâblés annotation que je préfère que cela me donnerait de la souplesse plus tard à se déplacer loin de Printemps (bien que j'ai l'habitude de le faire).
Parfois, vous avez besoin d'une instance de la classe A, mais vous n'avez pas Un magasin dans le champ de la classe. Vous avez juste besoin d'effectuer un one-shot de l'opération. Ou bien, vous utilisez Un pour obtenir une instance de B, et que vous laissez B dans le domaine.
Dans ces cas, un setter (ou constructeur) autowire vous conviendra le mieux. Vous n'aurez pas de inutilisés de classe-niveau de champs.
Exemple concret:
Vous devez construire RabbitTemplate (un objet qui envoie des messages à RabbitMQ)
Pour le construire, vous devez ConnectionFactory
http://docs.spring.io/spring-amqp/docs/latest_ga/api/org/springframework/amqp/rabbit/core/RabbitTemplate.html#RabbitTemplate-org.springframework.amqp.rabbit.connection.ConnectionFactory-
Vous n'avez pas besoin de stocker des ConnectionFactory. Dans ce cas, le code qui ressemble à ceci:
...vous servira mieux que directement permettra à l'autowiring de la ConnectionFactory champ.
Dans cet exemple, permettra à l'autowiring au constructeur niveau serait encore mieux, parce que votre objet sera toujours entièrement construit. Il est clair que ConnectionFactory est obligatoire de dépendance, pas une option.
Permettra à l'autowiring fonctionne mieux lorsqu'il est utilisé de manière cohérente sur l'ensemble du projet. Si permettra à l'autowiring n'est pas utilisé en général, il peut être source de confusion pour les développeurs à l'utiliser pour fils seulement un ou deux bean définitions. Avec @Autocâblés sur un champ que vous n'avez pas besoin d'une méthode de définition, qui d'une part rend la classe plus petite et plus facile à lire, mais d'autre part se moquer de la classe un peu plus laide.
Dépendances explicites dans la propriété et le constructeur-arg paramètres de toujours remplacer permettra à l'autowiring. Vous ne pouvez pas autowire soi-disant propriétés simples tels que des primitives, des Chaînes et des Classes (et des tableaux de telles propriétés simples). Cette limitation est par conception.
Permettra à l'autowiring est moins exacte que celle explicite de câblage. Le printemps est prudent pour éviter de deviner en cas d'ambiguïté qui peut avoir des résultats inattendus, les relations entre vos Printemps-objets gérés ne sont plus documentés de manière explicite.
Les informations de câblage peuvent ne pas être disponibles à des outils qui peuvent générer de la documentation à partir d'un Printemps conteneur.
Plusieurs bean définitions dans le conteneur peut correspondre au type spécifié par le poseur de méthode ou d'un constructeur argument autocâblés. Pour les tableaux, collections, ou des Cartes, ce n'est pas nécessairement un problème. Toutefois, pour les dépendances que s'attendre à une valeur unique, cette ambiguïté n'est pas arbitrairement résolu. Si pas unique bean définition est disponible, une exception est levée.
Si vous le pouvez, vous devriez éviter de l'incubateur. Si vous n'en avez pas besoin, c'est mieux quand il n'existe pas, droite?
Personnellement, je préfère Guice ce qui me permet d'écrire
Cela va plus loin: Avec un
final
domaine, je sais qu'il ne changera jamais, et j'ai l' le multithreading visibilité garantie.Si vous utilisez
@Autowired
annotation sur un propriété, le printemps va lancer la propriété à l'aide de spring.xml. Vous n'avez pas besoin de setter dans ce cas.Si vous utilisez
@Autowired
annotation sur un setter, vous spécifiez pour le printemps qu'il devrait lancer cette propriété à l'aide de cette méthode de définition où vous pouvez ajouter votre code personnalisé, comme de l'initialisation d'une autre propriété avec cette propriété.Utilisation avec Exemple:
Dans le cas de l'utilisation de DAO opérations à l'aide de JdbcTemplate, vous avez besoin de source de données, en tant que contribution à JdbcTemplate, mais la source de données n'est pas un bien en soi. Ainsi, vous pouvez utiliser la source de données Setter pour initialiser JdbcTempate par auto-câblage de la source de données Setter. Veuillez voir le code ci-dessous:
Dans le code ci-dessus, la seule utilisation de la source de données était d'obtenir passé dans JdbcTemplate. Ainsi, la création d'une propriété de la source de données n'a pas de sens ici. Donc, il suffit d'utiliser le @Autocâblés sur la méthode de définition de source de données de haricots pour obtenir son entrée de spring.xml et à en faire usage à l'époque elle-même.
Il existe un cas où l'aide de @Autocâblés sur une propriété FACULTATIVE ne fonctionnerait pas.
Si vous voulez faire un peu d'initialisation à l'aide de cette propriété, il peut ne pas être défini avant que le constructeur est appelé, et depuis il est facultatif, vous ne pouvez pas le mettre comme argument dans le constructeur.
Dans ce cas, il est préférable d'utiliser un @Autocâblés méthode de définition, de sorte que vous pouvez effectuer l'initialisation une fois que la propriété est autocâblés.