Erstens, und das ist das Wichtigste, werden alle Spring Beans verwaltet - sie "leben" in einem Container, der als "Anwendungskontext" bezeichnet wird.
Zweitens hat jede Anwendung einen Einstiegspunkt in diesen Kontext. Webanwendungen haben ein Servlet, JSF einen El-Resolver verwendet, usw. Außerdem gibt es einen Ort, an dem der Anwendungskontext gebootstrappt wird und alle Beans - autowired. In Webanwendungen kann dies ein Startup-Listener sein.
Autowiring geschieht, indem eine Instanz einer Bean in das gewünschte Feld in einer Instanz einer anderen Bean gesetzt wird. Beide Klassen sollten Beans sein, d.h. sie sollten so definiert sein, dass sie im Anwendungskontext leben.
Was bedeutet "lebendig" im Zusammenhang mit der Anwendung? Dies bedeutet, dass die Kontext instanziiert die Objekte, nicht Sie. D.h. - Sie machen niemals new UserServiceImpl()
- findet der Container jeden Injektionspunkt und setzt dort eine Instanz.
In Ihren Controllern haben Sie nur das Folgende:
@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);
}
}
Ein paar Anmerkungen:
- In Ihrem
applicationContext.xml
sollten Sie die Option <context:component-scan>
so dass die Klassen nach dem @Controller
, @Service
usw. Anmerkungen.
- Der Einstiegspunkt für eine Spring-MVC-Anwendung ist das DispatcherServlet, das jedoch vor Ihnen verborgen ist, so dass die direkte Interaktion und das Bootstrapping des Anwendungskontexts hinter der Szene stattfinden.
UserServiceImpl
sollte ebenfalls als Bohne definiert werden - entweder mit <bean id=".." class="..">
oder über die @Service
Bemerkung. Da es sich um den einzigen Implementierer von UserService
wird es injiziert.
- Neben der
@Autowired
Annotation kann Spring XML-konfigurierbares Autowiring verwenden. In diesem Fall wird allen Feldern, deren Name oder Typ mit einer bestehenden Bean übereinstimmt, automatisch eine Bean injiziert. Das war eigentlich die ursprüngliche Idee von Autowiring - Felder mit Abhängigkeiten ohne jegliche Konfiguration zu injizieren. Andere Annotationen wie @Inject
, @Resource
kann ebenfalls verwendet werden.