Frühjahrs @Configuration Annotation

Frühling @Configuration-Annotation ist Teil des Spring-Core-Frameworks. Die Spring Configuration-Annotation zeigt an, dass die Klasse @Bean-Definitionsmethoden hat. Daher kann der Spring-Container die Klasse verarbeiten und Frühlingsbohnen generieren, die in der Anwendung verwendet werden können.

Frühling @Configuration

Frühling @Configuration-Annotation ermöglicht es uns, Annotationen für Dependency Injection zu verwenden. Lassen Sie uns verstehen, wie man Spring-Konfigurationsklassen erstellt. Lassen Sie uns eine einfache Java-Bean-Klasse erstellen.

package com.journaldev.spring;

public class MyBean {

	public MyBean() {
		System.out.println("MyBean instance created");
	}
	
}

Bevor wir eine der Spring-Framework-Klassen verwenden, müssen wir ihre Abhängigkeiten zum Maven-Projekt hinzufügen.

<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.0.6.RELEASE</version>
</dependency>

Jetzt erstellen wir die Spring-Konfigurationsklasse.

package com.journaldev.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration {

    @Bean
    public MyBean myBean() {
		return new MyBean();
	}
	
}

Wir schreiben eine einfache Klasse und konfigurieren unsere einfache Spring-Konfigurationsklasse.

package com.journaldev.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MySpringApp {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.register(MyConfiguration.class);
		ctx.refresh();

		// MyBean mb1 = ctx.getBean(MyBean.class);

		// MyBean mb2 = ctx.getBean(MyBean.class);

		ctx.close();
	}

}

Wenn Sie die obige Anwendung ausführen, wird sie eine Ausgabe wie diese produzieren:

May 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchy
MyBean instance created
May 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchy

Beachten Sie, dass Spring Beans in seinen Kontext geladen werden, bevor wir diese überhaupt angefordert haben. Dies geschieht, um sicherzustellen, dass alle Beans ordnungsgemäß konfiguriert sind und die Anwendung bei einem Fehler schnell beendet wird. Außerdem muss ctx.refresh() aufgerufen werden, da sonst folgender Fehler auftritt, wenn wir versuchen, eine Bean aus dem Kontext zu erhalten.

Exception in thread "main" java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@f0f2775 has not been refreshed yet
	at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1076)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1106)
	at com.journaldev.spring.MySpringApp.main(MySpringApp.java:11)

Wenn Sie die Anweisungen, in denen ich Instanzen von MyBean erhalte, auskommentieren, werden Sie feststellen, dass der Konstruktor von MyBean nicht aufgerufen wird. Dies liegt daran, dass der Standardbereich von Spring Beans Singleton ist. Dies können wir mit der @Scope-Annotation ändern.

Was passiert, wenn wir die @Configuration-Annotation entfernen?

Was passiert, wenn wir die @Configuration-Annotation aus der Klasse MyConfiguration entfernen? Sie werden feststellen, dass es immer noch wie erwartet funktioniert und Spring Beans als Singleton-Klassen registriert und abgerufen werden. In diesem Fall handelt es sich jedoch bei einem Aufruf der Methode myBean() um einen einfachen Java-Methodenaufruf, und wir erhalten eine neue Instanz von MyBean, die nicht mehr Singleton ist. Um diesen Punkt zu beweisen, definieren wir eine weitere Bean, die eine Instanz von MyBean verwendet.

package com.journaldev.spring;

public class MyBeanConsumer {

	public MyBeanConsumer(MyBean myBean) {
		System.out.println("MyBeanConsumer created");
		System.out.println("myBean hashcode = "+myBean.hashCode());
	}

}

Unsere aktualisierte Spring-Konfigurationsklasse lautet:

package com.journaldev.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class MyConfiguration {

	@Bean
    public MyBean myBean() {
		return new MyBean();
	}
	
	@Bean
    public MyBeanConsumer myBeanConsumer() {
		return new MyBeanConsumer(myBean());
	}
}

Nun, wenn wir die Klasse MySpringApp ausführen, generiert sie folgende Ausgabe.

MyBean instance created
MyBean instance created
MyBeanConsumer created
myBean hashcode = 1647766367

Also ist MyBean nicht mehr Singleton, jetzt lassen Sie uns MyConfiguration erneut mit der @Configuration-Annotation versehen und die Klasse MySpringApp ausführen. Diesmal wird die Ausgabe wie folgt sein.

MyBean instance created
MyBeanConsumer created
myBean hashcode = 1095088856

Daher ist es besser, die @Configuration-Annotation mit Konfigurationsklassen zu verwenden, um sicherzustellen, dass unser Spring-Container sich so verhält, wie wir es möchten. Wenn Sie aus seltsamen Gründen die @Configuration-Annotation nicht verwenden möchten, können wir immer noch unsere Konfigurationsklasse erstellen, indem wir die Methode myBean() nicht aufrufen und stattdessen eine Instanzvariable von MyBean verwenden, die über die @Autowired-Annotation konfiguriert ist. Etwas ähnliches wie der folgende Code wird auch funktionieren.

package com.journaldev.spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class MyConfiguration {

	@Autowired
	MyBean myBean;
	
	@Bean
    public MyBean myBean() {
		return new MyBean();
	}
	
	@Bean
    public MyBeanConsumer myBeanConsumer() {
		return new MyBeanConsumer(myBean);
	}
}

Das ist alles zur Spring-Konfigurationsannotation, wir werden uns in zukünftigen Beiträgen mit anderen Spring-Annotationen befassen.

Sie können den Beispielcode aus unserem GitHub-Repository herunterladen.

Source:
https://www.digitalocean.com/community/tutorials/spring-configuration-annotation