Pranvera @Configuration Annotation


Metodat e përkufizimit Spring @Bean. Pra, kontejneri Spring mund të përpunojë klasën dhe të gjenerojë Spring Beans për t'u përdorur në aplikacion.

Pranvera @Configuration

Injeksion i varësisë së pranverës. Le të kuptojmë se si të krijojmë klasat e konfigurimit të pranverës. Le të krijojmë një klasë të thjeshtë java bean.

package com.journaldev.spring;

public class MyBean {

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

Përpara se të përdorim ndonjë nga klasat e kornizës Spring, do të duhet të shtojmë varësitë e tij në projektin maven.

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

Tani le të krijojmë klasën e konfigurimit të pranverës.

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();
	}
	
}

Le të shkruajmë një klasë të thjeshtë dhe të konfigurojmë klasën tonë të thjeshtë të konfigurimit Spring.

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();
	}

}

Nëse ekzekutoni aplikacionin e mësipërm, ai do të prodhojë dalje si kjo:

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

Vini re se Spring ngarkon fasulet në kontekstin e saj përpara se ne ta kemi kërkuar atë. Kjo është për t'u siguruar që të gjitha fasulet janë konfiguruar siç duhet dhe aplikimi dështon shpejt nëse diçka shkon keq. Gjithashtu duhet thirrur ctx.refresh(), përndryshe do të marrim gabimin e mëposhtëm kur do të përpiqemi të marrim ndonjë bean nga konteksti.

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)

Nëse i anuloni deklaratat ku po marr shembuj të MyBean, do të vini re se nuk po thërret konstruktorin e MyBean. Kjo është për shkak se qëllimi i paracaktuar i fasuleve pranverore është Singleton. Mund ta ndryshojmë duke përdorur shënimin @Scope.

Po sikur të heqim shënimin @Configuration?

Çfarë do të ndodhë nëse heqim shënimin @Configuration nga klasa MyConfiguration. Ju do të vini re se ajo ende funksionon siç pritej dhe fasulet e pranverës regjistrohen dhe merren si klasa singleton. Por në këtë rast, nëse bëjmë një thirrje në metodën myBean() atëherë do të jetë një thirrje e thjeshtë e metodës java dhe do të marrim një shembull të ri të MyBean dhe nuk do të mbetet singleton. Për të vërtetuar këtë pikë, le të përcaktojmë një fasule tjetër që do të përdorë shembullin MyBean.

package com.journaldev.spring;

public class MyBeanConsumer {

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

}

Klasa jonë e përditësuar e konfigurimit të pranverës është:

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());
	}
}

Tani kur ekzekutojmë klasën MySpringApp, ajo gjeneron daljen e mëposhtme.

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

Pra, MyBean nuk është më i vetëm, tani le të shënojmë përsëri MyConfiguration me shënimin @Configuration dhe të ekzekutojmë klasën MySpringApp. Këtë herë prodhimi do të jetë si më poshtë.

MyBean instance created
MyBeanConsumer created
myBean hashcode = 1095088856

Pra, është më mirë të përdorim shënimin @Configuration me klasat e konfigurimit për t'u siguruar që kontejneri ynë i pranverës të sillet ashtu siç duam ne. Nëse nuk dëshironi të përdorni shënimin @Autowired. Diçka si kodi më poshtë do të funksionojë gjithashtu.

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);
	}
}

Kjo është e gjitha për shënimin e konfigurimit të pranverës, ne do të shqyrtojmë shënimet e tjera pranverore në postimet e ardhshme.

Ju mund ta shkarkoni kodin shembull nga depoja jonë e GitHub.