2017-04-11 3 views
1

Ich habe eine Klasse mit @Configuration Annotated und definierte Methode init und Definierte es mit Annotation @Bean, aber wenn ich versuche, auf diese Bean zugreifen mit Auto-verdrahtet gibt es mir einen Fehler Die Abhängigkeiten von einigen der Bohnen in den Anwendungskontext bilden einen Zyklus:Kann Bean im Frühjahr Boot nicht definieren

┌─────┐ 
| Sum defined in class path resource [com/example/Application/Appconfig.class] 

@Configuration 
@EnableAutoConfiguration 
public class Appconfig { 

    @Bean 
    public int Sum(int a,int b){ 

     int c=a+b; 
     return c; 
    } 

Und meine Controller-Klasse

@Autowired 
    Appconfig appconfig; 


    @PostMapping(value = "/api/{id1}/{id2}") 
    public void math(@PathVariable int id1,@PathVariable int id2){ 

     appconfig.Sum(id1,id2); 
     System.out.println(id1); 
     System.out.println(id2); 
     System.out.println(appconfig.Sum(id1,id2)); 


    } 

Fehler

The dependencies of some of the beans in the application context form a cycle: 

┌─────┐ 
| Sum defined in class path resource [com/example/Application/Appconfig.class] 
└─────┘ 

Antwort

3

Ihre Abhängigkeiten sind kreisförmig, was bedeutet, dass A Sie B die A braucht erstellen müssen.

@Configuration 
@EnableAutoConfiguration 
public class Appconfig { 

    public int Sum(int a,int b){ 

     int c=a+b; 
     return c; 
    } 
} 

wird funktionieren, aber ist keine gute Praxis. Konfigurationsklassen sollten nicht @Autowired sein.

Im Spring Boot können Sie @Bean s auf zwei Arten erstellen. Man definiert eine Klasse als @Bean:

@Bean 
public class MyBean { 

} 

Der andere Weg über die Methode ist:

@Bean 
public RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

beide der oben Gesagte @Bean s erstellen, wenn die Context zu schaffen.

+0

Es gibt nichts "Korrektes" daran, sowohl '@ Configuration' als auch' @Bohnen' in einer Klasse zu löschen, und es wird in Spring Boot als schlechte Übung angesehen, Beans in der Bootstrap-Klasse der Anwendung zu definieren. (Fügen Sie in sehr kompakten Beispielen eine geschachtelte Klasse hinzu.) – chrylis

+0

@chrylis Ich stimme zu. Ich füge es der Antwort hinzu – xenteros

+0

Eine '@ Konfiguration' ist eine spezielle Bean, die mit' @ Component' (Meta-Annotation) versehen ist. 'AppConfig' ist eine Bean und kann injiziert werden –