Erkundung der Unterschiede zwischen den Spring-Anmerkungen @Configuration und @Component

Erkundung der Unterschiede zwischen den Spring-Anmerkungen @Configuration und @Component

9. Juli 2024

Es gibt grundsätzlich zwei Möglichkeiten, wie man in Spring Abhängigkeiten (auch Bean-Klassen genannt) registrieren kann: @Configuration und @Component, die wir im Folgenden erläutern werden.

Ein Bean ist, wie in einem früheren Beitrag erklärt, ein Objekt, das vom Spring IoC-Container verwaltet wird.

@Configuration und @Component sind Möglichkeiten, genau diese Beans zu registrieren. Lassen Sie uns die Unterschiede zwischen diesen beiden Anmerkungen erkunden.

Verwendung von @Component

@Component ist eine der Möglichkeiten, um Beans im Spring IoC-Container zu registrieren.

Schauen wir uns die Registrierung der folgenden drei Komponenten an:

Computer.java
@Component
public class Computer {
	MainBoard mainBoard;
	CPU cpu;

	public Computer(MainBoard mainboard, CPU cpu) {
		this.cpu = cpu;
		this.mainBoard = mainBoard;
	}

	void printComputerInfo() {
		System.out.println("CPU Name:" + cpu.name);
		System.out.println("CPU Hersteller:" + cpu.manufacturer);
		System.out.println("Hauptplatine Name:" + mainBoard.name);
		System.out.println("Hauptplatine Hersteller:" + mainBoard.manufacturer);
	}
}
MainBoard.java
@Component
public class MainBoard {
	String name; // Produktname
	String manufacturer; // Hersteller

	// Konstruktor
	public MainBoard() {
		this.name = "B760M Pro RS D5";
		this.manufacturer = "ASRock";
	}
}
CPU.java
@Component
class CPU {
	String name; // Produktname
	String manufacturer; // Hersteller

	// Konstruktor
	public CPU() {
		this.name = "Ryzen7 PRO 8700GE";
		this.manufacturer = "AMD";
	}
}

Mit dieser Methode werden die Computer, MainBoard und CPU Klassen jeweils im IoC-Container als Beans registriert.

Diese Komponenten werden zum Zeitpunkt der Ausführung der Applikation registriert, und wenn wir die Abhängigkeiten in einem Diagramm darstellen, sieht es folgendermaßen aus:

image

Verwendung von @Configuration und @Bean

@Configuration ist eine weitere Methode zur Registrierung von Beans im Spring IoC-Container.

Im Gegensatz zur Deklaration mit @Component, bei der die als Member-Variablen deklarierten Namen, Hersteller usw. vorab initialisiert sein müssen, tritt ein Fehler auf, wenn String-Variablen nicht initialisiert wurden:

Field name in com.example.demo.product.domain.MainBoard required a bean of type 'java.lang.String' that could not be found.

Obwohl ein Fehler vermieden werden kann, indem ein String-Typ als Bean registriert wird, ist der String an sich zu umfangreich, um als Bean verwendet zu werden.

Muss man die Membervariablen daher zwingend vorab initialisieren?

Nein, das ist nicht der Fall.

Mit @Configuration können Sie die Beans registrieren, während Sie die Parameter im Konstruktormethode beibehalten.

Unten sind die drei Klassen beschrieben, ohne @Component, dafür werden die Parameter in den Konstruktormethoden zur Initialisierung verwendet:

Computer.java
public class Computer {
	MainBoard mainBoard;
	CPU cpu;

	public Computer(MainBoard mainboard, CPU cpu) {
		this.cpu = cpu;
		this.mainBoard = mainBoard;
	}

	void printComputerInfo() {
		System.out.println("CPU Name:" + cpu.name);
		System.out.println("CPU Hersteller:" + cpu.manufacturer);
		System.out.println("Hauptplatine Name:" + mainBoard.name);
		System.out.println("Hauptplatine Hersteller:" + mainBoard.manufacturer);
	}
}
MainBoard.java
public class MainBoard {
	String name; // Produktname
	String manufacturer; // Hersteller

	// Konstruktor
	public MainBoard(String name, String manufacturer) {
		this.name = name;
		this.manufacturer = manufacturer;
	}
}
CPU.java
class CPU {
	String name; // Produktname
	String manufacturer; // Hersteller

	// Konstruktor
	public CPU(String name, String manufacturer) {
		this.name = name;
		this.manufacturer = manufacturer;
	}
}

Erstellen Sie nun eine Klasse namens ComputerConfig, deklarieren Sie @Configuration und registrieren Sie die Beans mit @Bean.

ComputerConfig.java
@Configuration
public class ComputerConfig {
    @Bean
    public Computer computer(MainBoard mainBoard, CPU cpu) {
        return new Computer(mainBoard, cpu);
    }

    @Bean
    public MainBoard mainBoard() {
        return new MainBoard("B760M Pro RS D5", "ASRock");
    }

    @Bean
    public CPU cpu() {
        return new CPU("Ryzen7 PRO 8700GE", "AMD");
    }
}

Durch die Verwendung von @Configuration können Sie die Beans registrieren, während Sie die Parameter im Konstruktormethode beibehalten.

Die Unterschiede in der Registrierung der Beans selbst sind kein großes technisches Problem.

Wann verwendet man welches?

@Component wird häufig für selbst erstellte Komponenten verwendet. Beispiele hierfür sind @Controller, @Repository, @Service, die typische Beispiele für vom Benutzer implementierte Komponenten sind.

@Configuration wird entsprechend seinem Namen verwendet, wenn Einstellungen von externen Klassen als Beans registriert werden sollen.

Zum Beispiel kann @Configuration verwendet werden, um DataSource als Bean zu registrieren, auch ohne Verwendung von application.yaml Datei. (Tatsächlich folgt auch application.yaml dem Prinzip, indem es YAML als Bean registriert, was in Spring als AutoConfiguration bezeichnet wird.)

DataSourceConfig.java
@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create()
                .url("jdbc:mysql://localhost:3306/test")
                .username("root")
                .password("password")
                .build();
    }
}