2015-12-09 18 views
17

Perché non posso usare @Autowired in questo caso?Differenza tra @Bean e @Autowired

@SpringBootApplication 
public class Application { 

    @Autowired 
    BookingService bookingService; 

    public static void main(String[] args) { 
     bookingService.book("Alice", "Bob", "Carol"); 
    } 
} 

ma può utilizzare @Bean

@SpringBootApplication 
public class Application { 

    @Bean 
    BookingService bookingService() { 
     return new BookingService(); 
    } 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 
     BookingService bookingService = ctx.getBean(BookingService.class); 
     bookingService.book("Alice", "Bob", "Carol"); 
    } 
} 

non sono i due modi per generare BookingService la stessa cosa?

+3

Bean annotazione è per la registrazione il bean nel contesto primavera, mentre Autowried annotazione è per ottenere il bean dal contenuto dell'applicazione Spring e collegarlo come dipendenza per un altro oggetto –

+0

È necessario fornire anche la classe BookingService. Perché se questo è annotato con Component, anche la tua prima classe funzionerebbe come la seconda. – PowerFlower

risposta

49

@Bean e @Autowired fare due cose molto diverse. Le altre risposte qui spiegano in un po 'più in dettaglio, ma ad un livello più semplice:

  • @Bean dice Primavera 'ecco un esempio di questa classe, si prega di tenere in mano e dare di nuovo a me quando chiedo '.

  • @Autowired dice "per favore datemi un'istanza di questa classe, ad esempio, una che ho creato con un'annotazione @Bean in precedenza".

Ha senso? Nel tuo primo esempio, stai chiedendo a Spring di fornirti un'istanza di BookingService, ma non ne creerai mai una, quindi Spring non ha nulla da darti. Nel tuo secondo esempio, stai creando una nuova istanza di BookingService, che ne parla a Spring e poi, nel metodo main(), la richiedi.

Se si volesse, si potrebbe rimuovere le due linee aggiuntive dal secondo metodo main(), e combinare le due esempi, come di seguito:

@SpringBootApplication 
public class Application { 

    @Autowired 
    BookingService bookingService; 

    @Bean 
    BookingService bookingService() { 
    return new BookingService(); 
    } 

    public static void main(String[] args) { 
    bookingService.book("Alice", "Bob", "Carol"); 
    } 
} 

In questo caso, l'annotazione @Bean dà primavera del BookingService, e la @Autowired ne fa uso.

Questo sarebbe un esempio un po 'inutile, poiché lo si utilizza tutto nella stessa classe, ma diventa utile se si dispone del @Bean definito in una classe e di @Autowired in uno diverso.

+0

In qualche modo quella risposta appare solo parzialmente corretta per me. Autowired può anche chiamare oggetti annotati con @Components. Inoltre, Autowired può essere utilizzato per metodi non solo per oggetti. – PowerFlower

+0

@PowerFlower, assolutamente ragione, il mio punto qui era di spiegare la differenza nel contesto della domanda. Sicuramente c'è molta più complessità in entrambe le annotazioni, ma stavo cercando di dare una spiegazione semplice e di alto livello per questo specifico esempio. – DaveyDaveDave

3
@Bean 
BookingService bookingService() { 
    return new BookingService(); 
} 

di annotazioni @Bean Registrazione solo questo servizio come un fagiolo (cioè una sorta di oggetto) nel contesto applicativo primavera. In parole semplici, è solo una registrazione ma niente.

@Autowired 
BookingService bookingService; 

Annotazione una variabile con @Autowired iniettare una BookingService fagioli (cioè Object) dalla primavera Application Context.

I.E, il bean registrato con @Bean verrà inserito nella variabile annotata con @Autowired.

Spero che questo chiarisca i tuoi dubbi!

+0

ma non posso usare la funzione di BookingService se inserisco BookingService con @Autowired –

+0

Ora so che è perché nel main() ho ottenuto l'errore "modifica il modificatore di book() in static", posso usare l'oggetto di BookingService in altre funzioni .Ma non so perché –

+0

@zhuochenshen non sono sicuro di cosa si tratta all'interno della tua classe e problema attuale. Ho risposto solo alla tua domanda "differenza". Puoi postare un'altra domanda riguardo al tuo prossimo problema. – pmverma

3

grande risposta da @DaveyDaveDave Nell'esempio invece di

@Bean 
    BookingService bookingService() { 
    return new BookingService(); 
    } 

È possibile utilizzare @Service annotazione sulla classe BookingService