@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 @Inject
d'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.