41 votes

Différence entre les annotations printanières

J'ai commencé à lire le printemps avec annotations et je me suis embrouillé. Je mets mes doutes en deux parties distinctes comme ci-dessous:

1) Différence entre `` ? J'ai lu que les deux supprime la nécessité de code de câblage à mettre dans XML, mais n'a pas obtenu la différence entre ces.

2) Différence entre et ?

Tout en donnant la différence, s'il vous plaît spécifier lequel utiliser quand avec ses avantages / inconvénients

55voto

Boris Treukhov Points 5564

@Component et @Configuration sont en effet très différents types d'annotations.

@Component et similaires annotations (@Service, @Repository, etc. )et de ses JSR 330 homologue @Named vous permettent de déclarer les haricots qui sont recueillis par le balayage auto avec <context:component-scan/> ou @ComponentScan ils le registre de la fève de définition pour les classes, de sorte qu'ils sont à peu près équivalent à la déclaration de la spécifié de haricots avec l' <bean ... /> balise XML. Ce bean types de se conformer à la norme proxy politiques de création.

@Configuration d'annotation a été conçu comme le remplacement du fichier de configuration XML. Pour créer @Configuration annoté les haricots, le Printemps sera toujours utiliser CGLIB à la sous-classe de l' @Configuration annoté de la classe, surchargeant ses @Bean méthode annotée de le remplacer avec de la fève de recherche de méthode pour faire singleton haricots être créé qu'une seule fois. (Printemps ne pas utiliser CGLIB d'intercepter interne les appels de méthode de normal Printemps des haricots, il crée une instance distincte de procuration à la place(de la même manière que JDK proxy ne). Cela permet d'utiliser des proxys pour éviter la cardinalité de non - concordance, par exemple, un proxy singleton peut chercher de l'actuelle session bean, qui n'est pas possible avec l'héritage de classe seulement. ). Malgré cela, @Configuration annoté de classes sont encore en mesure d'utiliser annoté(@Autowired, @Inject etc.) les champs et les propriétés de la demande de haricots (et même les autres @Configuration annoté haricots trop) à partir du conteneur.

Exemple de 4.12.5 section de la documentation

@Configuration
public class AppConfig {

  @Bean
  public ClientService clientService1() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }
  @Bean
  public ClientService clientService2() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }

  @Bean
  public ClientDao clientDao() {
    return new ClientDaoImpl();
  }
}

dans l'exemple ci-dessus, seulement un ClientDao instance sera créée.

@Autowired est le Printemps annotation, tout en @Inject est un JSR 330 annotation. @Inject est équivalent à @Autowired ou @Autowired(required=true), mais vous ne pouvez pas obtenir de l' @Autowired(required=false) comportement avec la JSR 330 @Injectd'annotation. Cette annotation utilise toujours par type permettra à l'autowiring.

Le printemps met en œuvre la JSR-250 @Resource d'annotation de manière assez spéciale. @Resource a été conçu à l'origine pour la localisation des ressources JNDI dans Java EE, mais le Printemps s'élargit, il applicabilité rendant possible le fil pour les bean dans le conteneur(JNDI ressources sont disponibles comme les haricots avec l'aide de SimpleJndiBeanFactory). Le nom du bean peut être spécifié en tant que name attribut de l' @Resource d'annotation, si aucun nom n'est spécifié, le nom de la annoté champ ou une propriété sera utilisée. Une autre particularité est que si aucune bean avec le nom de la propriété a été trouvé, le printemps de secours à par-type de câblage.

Exemple Imaginer que nous avons un AlphaClass bean nommé beanAlpha et un BetaClass haricot beanBeta dans le conteneur.

@Resource 
BetaClass something;  // Wires to beanBeta - by-type

@Resource 
BetaClass beanAlpha;  // Will throw exception, because "beanAlpha" is not BetaClass -> it's a bad idea to use @Resource as a replacement of @Autowired

@Resource 
Object beanAlpha;  //Wires to beanAlpha - by-name

C'est donc une bonne pratique de toujours spécifier le nom de la ressource explicitement lors de l'utilisation d' @Resource d'annotation.

La Documentation

Le printemps des annotations

Bean annotations standard

mise à jour fixe JSR références shevchik a souligné. DI des annotations spécifiques sont fournis par la JSR-330, qui a été développé par Google Guice), et un Cadre SpringSource(Framework Spring) ingénieurs. @Resource est JNDI et prévue par la JSR-250.

22voto

Karna Points 10541

est équivalent à ,
est équivalent à .

5voto

Kaushik Lele Points 893

Dans la plupart des réponses ci-dessus, les utilisateurs suggèrent-à-dire que @Composant et @ Configuration servent à des fins différentes. Mais je ne vois pas qu'il se passe dans la réalité.

Mais j'ai une simple Spring MVC de l'application.

@Configuration
    public class SpringConfiguration {

@Bean
public  InternalResourceViewResolver initViewResolver(){
    InternalResourceViewResolver x = new InternalResourceViewResolver();
    x.setPrefix("/WEB-INF/jsp/");
    x.setSuffix(".jsp");
    return x;
}

}

Cette classe fonctionne bien, même si c'est avec l'annotation @Component au lieu de @Configuration.

De la même façon à l'intérieur d'une classe annotée @Composant si vous avez des méthodes annotées avec @Haricots, les fèves sont créés lorsque le contexte est dmeno.

Donc, je pense, c'est juste pour la lisibilité du code que nous devrions marque de configuration principal de la classe comme @Configuration et d'autres classes avec @Composant. Exécution sage il n'y a aucune différence.

2voto

Sur la différence entre @Autowired, @Inject et @Resource vous pouvez regarder ici. Ici vous pouvez description détaillée et la comparaison.

En ce qui concerne la première différence: @Configuration est utilisé comme remplacement pour XML-en fonction de la configuration, c'est à dire. il marque les classes que ceux utilisés pour l' Java-en fonction de la configuration, voir ici. À son tour, @Component est en fait utilisé pour marquer les classes à être instancié par Spring et @Configuration est méta-annotations @Component d'annotation.

@Component et @Configuration servent à des fins différentes de sorte qu'il n'est pas judicieux de les comparer.

2voto

Rich Cowin Points 258

1) Si vous voulez XML de configuration, puis de les ignorer @Configuration, que ce n'est utile que pour Java config. Configuration XML est probablement le meilleur pour quelqu'un de familier avec le Printemps comme il y a plus d'exemples disponibles.

@Composante annoté classes sont ramassés au cours de la composante de la numérisation. Les utiliser pour l'étiquette de classes que vous souhaitez exposer, comme le Printemps des haricots. Encore une fois, vous pouvez simplement déclarer l'ensemble de vos haricots dans le fichier XML de configuration et d'ignorer @Composante tout à fait.

2) Si vous êtes heureux pour attacher votre demande de Printemps, puis utilisez @Autowire plutôt que de la javax équivalent @Inject. Je suggère que l'acceptation d'une dépendance au Printemps est la meilleure façon de commencer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X