Spring Boot Autowired Problem

jforg-sq

Neues Mitglied
Hallo zusammen,
ich hoffe mir kann hier jemand helfen. Ich bin dabei mich in Spring einzuarbeiten und habe ein eigentlich einfaches Mini-Projekt mit den unten angegebenen Klassen angelegt.
Ich versuche gerade die Grundlagen zu verstehen, also Dependency Injection etc.
Das Problem ist nun, dass dieses einfache Beispiel zu einer NullPointerException führt.
Demnach schlägt @Autowired hier fehl. Durch Zufall habe ich herausgefunden, dass es funktioniert wenn ich das Attribut calculation static mache und @Autowired über ein Setter setze. Aber das ergebt für mich irgendwie kein Sinn. Hoffe mir kann das jemand erklären.
Vielen Dank im Voraus.

Java:
@SpringBootApplication
public class SimpleAppApplication {
    public static void main(String[] args) {
        SpringApplication.run(SimpleAppApplication.class, args);
              
        Calculator calculator = new Calculator();
        calculator.sum(1, 2);

    }
}

Code:
public interface Calculation {
    int calculate(int... summands);
}

Java:
@Component
public class Addition implements Calculation {

    @Override
    public int calculate(int... summands) {
        int sum = 0;
       
        for (int i : summands) {
            sum += i;
        }
       
        return sum;
    }

}

Java:
@Component
public class Calculator {

    @Autowired
    private Calculation calculation;

    public Calculation getCalculation() {
        return calculation;
    }

    public void sum(int a, int b) {
        System.out.println(calculation.calculate(a, b));
    }

}
 
Benutzt den ApplicationContext den von run zurückbekommst. Damit kannst du dir dann dein Calculator Objekte erzeugen lassen. Wenn du dir einfach über new das Objekt erstellst, weiß Spring nichts davon und kann dementsprechend das autowired nicht korrekt auflösen.
 
So funktioniert es.
Java:
ConfigurableApplicationContext context = SpringApplication.run(SimpleAppApplication.class, args);
Calculator calculator = (Calculator) context.getBean("calculator");
Vielen Dank. Das macht tatsächlich Sinn 🙂
 

Zurück
Oben