Skip to main content

Instanciation et injection

Comme vous l'avez remarqué, nous avons jusqu'ici écrit des classes (par exemple des controllers) mais nous ne les avons pas instancié (avec le mot clé new).

Au démarrage de l'application, Spring scanne le code, et va instancier lui même toutes les classes annotées avec :

  • @Controller/@RestController
  • @Service
  • @Repository
  • @Component

Ces instances peuvent être injectées dans d'autres objets. Par exemple, si votre classe Controller a besoin d'accéder à un service, il est possible d'injecter ce service dans le controller.

Injection par annotation sur l'attribut, avec @Autowired

@RestController
public class ArticleController {

@Autowired
private ArticleService articleService;

//...
}

Injection par le constructeur :

  • le constructeur prends en paramètre les dépendances
  • oblige à fournir les dépendances, même en instanciant l'objet manuellement
@RestController
public class ArticleController {

private ArticleService articleService;

public ArticleController(ArticleService articleService) {
this.articleService = articleService;
}

// ...
}

Injection par setter :

  • Spring utilise le setter de l'attribut pour lui donner une valeur
  • Un objet peut donc se retrouver avec des attributs null
@RestController
public class ArticleController {

private ArticleService articleService;

public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}

// ...
}

TP6 - Injection de dépendances

  1. Créez une classe @Service nommée ServiceA
  2. Créez une classe @Service nommée ServiceB
  3. Injectez une référence à ServiceA dans ServiceB via un constructeur
  4. Créez une classe @Service nommée ServiceC
  5. Injectez une référence à ServiceB dans ServiceC via un setter
  6. Essayez d'injecter une référence à ServiceC dans ServiceA via un attribut @Autowired, que se passe t'il au démarrage de l'application ?