2015-03-19 16 views
22

Mi chiedo quale sarebbe il posto migliore per un'applicazione Spring Boot per registrare ulteriori bean. Ho una classe Main annotata con @SpringBootApplication e i bean definiti in quella classe vengono rilevati. Ma quando li metto in un'altra classe sembra che non vengano registrati.Dove mettere @Bean in Spring Boot?

Durante la lettura della documentazione ho avuto l'idea che il @SpringBootApplication cercasse implicitamente classi con annotazioni @Bean in esse.

Quindi le mie opzioni sono ora:

  1. mettere tutti @Bean fagioli annotato nella mia classe principale

    @SpringBootApplication 
    public class MyApplication { 
    
        @Bean 
        public Filter AuthenticationFilter() { 
         return new AuthenticationFilter(); 
        } 
    
        public static void main(String[] args) { 
         SpringApplication.run(MyApplication.class, args); 
        } 
    } 
    
  2. Crea una classe di configurazione e annotare che con @Configuration

    @Configuration 
    public class MyConfiguration { 
        @Bean 
        public Filter AuthenticationFilter() { 
         return new AuthenticationFilter(); 
        } 
    } 
    

C'è un modo migliore per farlo?

+3

Vedi i [documenti API di '@ Bean'] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context /annotation/Bean.html). Normalmente metterei quei metodi in una classe annotata con '@ Configuration'. Perché pensi che non sia una buona idea? I documenti parlano anche di una modalità "lite". – Jesper

+9

2. è il modo per farlo. '@ SpringBootApplication' è un'annotazione di convenienza che include' @ Configuration', quindi se non hai molti bean, puoi metterli tutti lì dentro. Se hai molti bean e/o sono in qualche modo raggruppati in modo logico, puoi aggiungere ulteriori classi '@ Configuration'. Ma non esiste un modo "migliore" per farlo. –

risposta

1

Dipende dalle scelte personali e non c'è un modo buono o cattivo per farlo. Come è preferibile o mostrato nella documentazione dei riferimenti di avvio a molla.

Come la classe principale di annotazione con @SpringBootApplication rende conveniente l'applicazione di avvio di avvio. Ma cerca solo i pacchetti secondari, quindi la configurazione di nidificazione all'interno della sottocartella non rileverà automaticamente @Bean, che è l'unica cosa da ricordare se non che si tratta di preferenze personali.

9

È piuttosto una questione di preferenza, ma è generalmente considerata la migliore procedura per mettere i bean esposti nelle classi di configurazione, che sono raggruppate logicamente.

Ad esempio, è possibile che siano presenti diverse classi di configurazione con un numero di bean contenuto all'interno di ciascuna: Una classe di configurazione di autenticazione con bean per AuthenticationProvider o UserDetailsService; una classe di configurazione Thymeleaf contenente i fagioli per vari dialoghi Thymeleaf, ecc.

5

In realtà, è una vostra scelta che non esiste uno standard di primavera per dire quale sia il migliore ma mentre si definisce una classe I principi di progettazione OOP dicono che una classe dovrebbe essere loosely coupled e highly cohesive, dovrebbe follow Single Responsibility Principle (SRP), Qui

Coupling -> grado di conoscenza di una classe ha circa un'altra classe

Cohesion -> Corso di Laurea che racconta come ben focalizzato la classe è

SRP -> Una classe dovrebbe avere una sola responsabilità, ci dovrebbe essere un solo motivo per cambiare classe.

Quindi, secondo la coesione e il principio di SRP, la classe dovrebbe essere ben focalizzata e avere una sola responsabilità.

Qui nel tuo caso hai solo 2 fagioli ma in futuro, questi fagioli potrebbero aumentare. Quindi dovresti seguire il tuo secondo punto e creare un'altra classe per la dichiarazione dei bean.

E nella mia scelta dovrebbe anche creare più classi di configurazione, quindi una classe di configurazione dovrebbe avere un tipo simile di fagioli.

1

Sì, compresi i bean all'interno della classe @Configuration è in genere il modo preferito per Spring.

Questo è anche uno dei modi primavera raccomanda l'iniezione di interdipendenze tra i fagioli è mostrato nel seguente esempio copiato dal manuale di riferimento del Primavera here:

Inoltre, l'ambito predefinito di @Beans è Singleton, se si specificare un diverso ambito come PROTOTYPE la chiamata verrà passata al metodo originale. Dai un'occhiata a questa sezione nel Spring Reference Guide