2016-10-11 5 views
2

Ich habe 3 Klassen, die in verschiedenen Paketen in einer Spring-Boot-Anwendung wie folgt gefunden werden: Warum funktioniert @Autowired nur in bestimmten Klassen? Alles, was ich falsch mache?Spring Boot Autowired fehlgeschlagen - null

@Configuration 
public class Configurations{ 
    @Autowired 
    Prop prop; //works fine 

    @Bean 
    //other bean definitions 

} 

@Component 
public class Prop{ 
    public void method(){}; 
} 

public class User{ 
    @Autowired 
    Prop prop; //does not work, null 

    public void doWork(){ 
     prop.method(); 
    } 

} 

Ich habe auch versucht, die @PostConstruct, aber dasselbe Ergebnis

public class User{ 
     @Autowired 
     Prop prop; //does not work, null 

     @PostConstruct 
     public void doWork(){ 
      prop.method(); 
     } 

    } 
+0

Komponente Annotation in Bean Annotation ändern danach können Sie Bean Annotation verwenden und erstellen Sie eine Methode in der Konfiguration danach können Sie auf andere Methoden Bean öffentliche prop prop() {...} verwenden –

Antwort

5

Die @Autowired Annotation funktioniert nur, wenn Frühling feststellt, dass die Klasse selbst eine Spring-Bean sein sollte.

In Ihrem ersten Beispiel notierten Sie Configurations mit der @Configuration Annotation. Ihre User Klasse hat auf der anderen Seite keine Annotation, die anzeigt, dass es eine Spring-Bean sein sollte.

Es gibt verschiedene Anmerkungen (mit unterschiedlichen Bedeutungen) Klasse abgeholt vom Frühjahr Behälter zu machen, einige Beispiele sind @Service, @Component, @Controller, @Configuration, .... Dies funktioniert jedoch nur, wenn sich Ihre Klasse in einem Paket befindet, das vom Spring-Container gescannt wird. Mit Spring Boot ist der einfachste Weg, dies zu garantieren, indem Sie Ihre User Klasse in ein (Sub-) Paket Ihrer Hauptklasse (die mit @SpringBootApplication annotierte Klasse) setzen.

Sie können auch Ihre Bohne manuell erstellen, indem Sie die folgende Methode zu schreiben in Ihrem Configurations:

@Bean 
public User user() { 
    return new User(); 
} 

In diesem Fall müssen Sie Ihre User Klasse nicht mit Anmerkungen versehen, noch müssen Sie sicherstellen, dass es ist in einem Paket, das gescannt wird.

Verwandte Themen