Spring @Configuration annotatie is onderdeel van het Spring Core-framework. De Spring Configuration-annotatie geeft aan dat de klasse @Bean-definitiemethoden heeft. Zo kan de Spring-container de klasse verwerken en Spring Beans genereren die in de toepassing kunnen worden gebruikt.
Spring @Configuration
De Spring @Configuration-annotatie stelt ons in staat om annotaties te gebruiken voor dependency injection. Laten we begrijpen hoe we Spring Configuration-klassen kunnen maken. Laten we een eenvoudige Java Bean-klasse maken.
package com.journaldev.spring;
public class MyBean {
public MyBean() {
System.out.println("MyBean instance created");
}
}
Voordat we een van de Spring-frameworkklassen gebruiken, moeten we de afhankelijkheden toevoegen aan het Maven-project.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
Latens maken we de Spring Configuration-klasse.
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();
}
}
Laten we een eenvoudige klasse schrijven en onze eenvoudige Spring Configuration-klasse configureren.
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();
}
}
Als je de bovenstaande toepassing uitvoert, wordt er output zoals deze geproduceerd:
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
Let op dat Spring bonen laadt in zijn context voordat we er zelfs om vragen. Dit is om ervoor te zorgen dat alle bonen correct geconfigureerd zijn en de toepassing snel mislukt als er iets fout gaat. Ook moet ctx.refresh()
worden aangeroepen, anders krijgen we de volgende fout wanneer we proberen een boon uit de context te krijgen.
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)
Als je de opmerkingen waar ik instanties van MyBean krijg, uitcommentarieert, zul je merken dat het de constructor van MyBean niet aanroept. Dit komt omdat de standaardscope van spring bonen Singleton is. We kunnen dit wijzigen met behulp van de @Scope
-annotatie.
Wat als we @Configuration-annotatie verwijderen?
Wat gebeurt er als we de @Configuration-annotatie verwijderen uit de klasse MyConfiguration? Je zult merken dat het nog steeds werkt zoals verwacht en dat Spring-bonen worden geregistreerd en opgehaald als singleton-klassen. Maar in dit geval, als we een oproep doen naar de myBean()
-methode, zal het een gewone Java-methodenoproep zijn en krijgen we een nieuwe instantie van MyBean en blijft het geen singleton. Om dit punt te bewijzen, laten we een andere boon definiëren die gebruik zal maken van de MyBean-instantie.
package com.journaldev.spring;
public class MyBeanConsumer {
public MyBeanConsumer(MyBean myBean) {
System.out.println("MyBeanConsumer created");
System.out.println("myBean hashcode = "+myBean.hashCode());
}
}
Onze bijgewerkte Spring Configuration-klasse is:
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());
}
}
Nu we de klasse MySpringApp
uitvoeren, genereert het de volgende uitvoer.
MyBean instance created
MyBean instance created
MyBeanConsumer created
myBean hashcode = 1647766367
Dus MyBean is niet langer een singleton, laten we nu MyConfiguration
opnieuw annoteren met de @Configuration
-annotatie en de klasse MySpringApp
uitvoeren. Deze keer zal de uitvoer als volgt zijn.
MyBean instance created
MyBeanConsumer created
myBean hashcode = 1095088856
Het is dus beter om de @Configuration
-annotatie te gebruiken met configuratieklassen om ervoor te zorgen dat onze Spring-container zich gedraagt zoals we willen. Als je om vreemde redenen de @Configuration-annotatie niet wilt gebruiken, kunnen we nog steeds onze configuratieklasse maken door de myBean()
-methode niet aan te roepen en in plaats daarvan een instantievariabele van MyBean te gebruiken die geconfigureerd is via de @Autowired-annotatie. Iets als de onderstaande code zal ook werken.
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);
}
}
Dat is alles voor de Spring Configuration-annotatie, we zullen andere Spring-annotaties in toekomstige berichten bekijken.
Je kunt het voorbeeldcode downloaden van onze GitHub Repository.
Source:
https://www.digitalocean.com/community/tutorials/spring-configuration-annotation