Premièrement, et c'est le plus important, tous les Spring beans sont gérés - ils "vivent" à l'intérieur d'un conteneur, appelé "contexte d'application".
Ensuite, chaque application dispose d'un point d'entrée dans ce contexte. Les applications Web ont un Servlet, JSF utilise un el-resolver, etc. De plus, il y a un endroit où le contexte de l'application est bootstrapé et où tous les beans - autowired. Dans les applications web, cela peut être un listener de démarrage.
L'autocâblage se fait en plaçant une instance d'un bean dans le champ souhaité d'une instance d'un autre bean. Les deux classes doivent être des beans, c'est-à-dire qu'elles doivent être définies pour vivre dans le contexte de l'application.
Qu'est-ce que "vivre" dans le contexte de l'application ? Cela signifie que le contexte instancie les objets, pas vous. C'est-à-dire que vous ne faites jamais new UserServiceImpl()
- le conteneur trouve chaque point d'injection et y place une instance.
Dans vos contrôleurs, vous avez juste ce qui suit :
@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {
// Tells the application context to inject an instance of UserService here
@Autowired
private UserService userService;
@RequestMapping("/login")
public void login(@RequestParam("username") String username,
@RequestParam("password") String password) {
// The UserServiceImpl is already injected and you can use it
userService.login(username, password);
}
}
Quelques notes :
- Dans votre
applicationContext.xml
vous devez activer l'option <context:component-scan>
afin que les classes soient analysées pour le @Controller
, @Service
etc. annotations.
- Le point d'entrée d'une application Spring-MVC est le DispatcherServlet, mais il vous est caché, et donc l'interaction directe et l'amorçage du contexte de l'application se font derrière la scène.
-
UserServiceImpl
doivent également être définis comme des haricots, soit en utilisant la fonction <bean id=".." class="..">
ou en utilisant le @Service
annotation. Puisqu'il sera le seul implémenteur de UserService
il sera injecté.
- En dehors de la
@Autowired
Spring peut utiliser un câblage automatique configurable en XML. Dans ce cas, tous les champs dont le nom ou le type correspond à un bean existant se voient automatiquement injecter un bean. En fait, c'était l'idée initiale de l'autowiring - avoir des champs injectés avec des dépendances sans aucune configuration. D'autres annotations comme @Inject
, @Resource
peut également être utilisé.