Le @Configuration annotation de Spring fait partie du framework principal de Spring. L’annotation Spring Configuration indique que la classe a des méthodes de définition @Bean. Ainsi, le conteneur Spring peut traiter la classe et générer des Spring Beans à utiliser dans l’application.
Spring @Configuration
L’annotation Spring @Configuration nous permet d’utiliser des annotations pour l’injection de dépendances. Commençons par comprendre comment créer des classes de configuration Spring. Créons une classe Java simple.
package com.journaldev.spring;
public class MyBean {
public MyBean() {
System.out.println("MyBean instance created");
}
}
Avant d’utiliser l’une des classes du framework Spring, nous devrons ajouter ses dépendances au projet Maven.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
Créons maintenant la classe de configuration Spring.
package com.journaldev.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
Écrivons une classe simple et configurons notre classe de configuration Spring.
package com.journaldev.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MySpringApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(MyConfiguration.class);
ctx.refresh();
// MyBean mb1 = ctx.getBean(MyBean.class);
// MyBean mb2 = ctx.getBean(MyBean.class);
ctx.close();
}
}
Si vous exécutez l’application ci-dessus, elle produira une sortie comme ceci :
May 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchy
MyBean instance created
May 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchy
Remarquez que Spring charge les beans dans son contexte avant même que nous ne les ayons demandés. Cela garantit que tous les beans sont correctement configurés et que l’application échoue rapidement en cas de problème. De plus, ctx.refresh()
doit être appelé, sinon nous obtiendrons l’erreur suivante lorsque nous essaierons d’obtenir un bean du contexte.
Exception in thread "main" java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@f0f2775 has not been refreshed yet
at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1076)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1106)
at com.journaldev.spring.MySpringApp.main(MySpringApp.java:11)
Si vous décommentez les instructions où je récupère des instances de MyBean, vous remarquerez qu’elles n’appellent pas le constructeur de MyBean. C’est parce que la portée par défaut des beans Spring est Singleton. Nous pouvons la modifier en utilisant l’annotation @Scope
.
Que se passe-t-il si nous supprimons l’annotation @Configuration?
Que se passera-t-il si nous supprimons l’annotation @Configuration de la classe MyConfiguration. Vous remarquerez que cela fonctionne toujours comme prévu et que les beans Spring sont enregistrés et récupérés en tant que classes singleton. Mais dans ce cas, si nous appelons la méthode myBean()
, ce sera un simple appel de méthode Java et nous obtiendrons une nouvelle instance de MyBean et elle ne restera pas singleton. Pour prouver ce point, définissons un autre bean qui utilisera une instance de MyBean.
package com.journaldev.spring;
public class MyBeanConsumer {
public MyBeanConsumer(MyBean myBean) {
System.out.println("MyBeanConsumer created");
System.out.println("myBean hashcode = "+myBean.hashCode());
}
}
Notre classe de configuration Spring mise à jour est :
package com.journaldev.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
@Bean
public MyBeanConsumer myBeanConsumer() {
return new MyBeanConsumer(myBean());
}
}
Maintenant, lorsque nous exécutons la classe MySpringApp
, elle génère la sortie suivante.
MyBean instance created
MyBean instance created
MyBeanConsumer created
myBean hashcode = 1647766367
Ainsi, MyBean n’est plus un singleton, maintenant annotons à nouveau la classe MyConfiguration
avec l’annotation @Configuration
et exécutons à nouveau la classe MySpringApp
. Cette fois, la sortie sera comme ci-dessous.
MyBean instance created
MyBeanConsumer created
myBean hashcode = 1095088856
Il est donc préférable d’utiliser l’annotation @Configuration
avec les classes de configuration pour s’assurer que notre conteneur Spring se comporte comme nous le souhaitons. Si vous ne voulez pas utiliser l’annotation @Configuration pour des raisons étranges, nous pouvons toujours créer notre classe de configuration en ne faisant pas appel à la méthode myBean()
et plutôt en utilisant une variable d’instance de MyBean configurée via l’annotation @Autowired. Quelque chose comme le code ci-dessous fonctionnera également.
package com.journaldev.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//@Configuration
public class MyConfiguration {
@Autowired
MyBean myBean;
@Bean
public MyBean myBean() {
return new MyBean();
}
@Bean
public MyBeanConsumer myBeanConsumer() {
return new MyBeanConsumer(myBean);
}
}
C’est tout pour l’annotation de configuration Spring, nous examinerons d’autres annotations Spring dans de futurs articles.
Vous pouvez télécharger le code d’exemple depuis notre Dépôt GitHub.
Source:
https://www.digitalocean.com/community/tutorials/spring-configuration-annotation