2012-10-11 17 views
7

Sto lavorando su un codice esistente che utilizza un controller per chiamare un metodo sul secondo controller. Ci sono 2 implementazioni che ho visto finora.Spring MVC, chiamare un altro controller dall'interno di un controller

1 ° Attuazione

return new Controller().method(request, response); 

2 ° Attuazione

@Autowired 
private Controller controller. 

return this.controller.method(request, response); 

Qual è l'implementazione di destra, quali sono i problemi se qualcuno con uno di loro.

+0

Qual è il vantaggio di questo? In questo modo si rompono molte convenzioni e dovresti prendere in considerazione la possibilità di rivedere, cioè suddividere il codice del controller e magari spostare parte della logica nel livello aziendale. – dardo

risposta

9

Il semplice fatto che è necessario chiamare un metodo da un altro controller rivela un probabile difetto di progettazione.

Con l'opzione 1, si perde tutto ciò che il contenitore DI Spring ti ha portato: vale a dire che l'altro controller può essere istanziato da Spring con alcune altre dipendenze cablate in esso. Se lo installi tu stesso, anche se funziona in questo momento, perché probabilmente non hai dipendenze da @Autowired/@Value, si interromperà una volta aggiunte le dipendenze su altre risorse. Inoltre, hai già un'istanza che il contenitore ha creato per te, perché crearne altri?

1

Il primo ha bisogno di più lavoro, in primo luogo si vuole veramente creare una nuova istanza di classe Controller ogni volta?

Il secondo utilizza un modello noto come iniezione di dipendenza o inversione di controllo che è più bello. Lascia che sia la primavera a gestire l'ambito del bean, per impostazione predefinita creerà solo 1 istanza della classe Controller, tuttavia se a un certo punto (per qualche motivo) non vuoi che questo comportamento sia semplice per creare molte istanze ...

9

Sembra che sia necessario rifattorizzare il codice. Estrarre ciò che è comune tra i due controller in una classe separata, quindi chiamarlo da entrambi i controller.

+2

+1 per le buone pratiche, e per essere di Milwaukee, e per ribadire fondamentalmente il mio commento. – dardo

4

Si sta sbagliando completamente. Vedi la risposta Costi Ciudatu's per ciò che è sbagliato.

Soluzione: Consiglio di avere service layer and dao layer classes associato al numero controllers. Supponiamo di avere AccountController, si avrà la classe AccountService (interfaccia + implementazione) e AccountDao (interfaccia + implementazione).

Ora, se utente accede (LoginController) e avete bisogno conto in modo da autowire AccountService in LoginController, si otterrà dettagli dell'account dell'utente dal AccountService metodi.

9

Se si effettua una chiamata tra i controller, o c'è un difetto o si desidera effettuare un reindirizzamento, che è totalmente valido. Se il reindirizzamento è il caso, basta tornare al metodo del controller come segue:

return "redirect:/yourDestinationControllerPath"; 
Problemi correlati