Merhabalar arkdaşlar. Bu yazıda Spring içerisinde Simple Values Injecting ve Injecting Values by Using SpEL konularını işleyeceğiz.

Simple Values Injecting

Simple Values Injecting konusundan anlamamız gereken basit değerleri yani önceden tanımlı değerleri XML içinde tanımlayıp kullanabilmek ya da class içerisinde yine Spring yardımı ile kullanabilmektir.

InjectSimple.java

package com.ilkaygunel.springtutorials.injectingsimplevalues;

import org.springframework.context.support.GenericXmlApplicationContext;

public class InjectSimple {

	private String name;
	private String surname;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public static void main(String[] args) {
		GenericXmlApplicationContext genericXmlApplicationContext = new GenericXmlApplicationContext();
		genericXmlApplicationContext.load("injecting-simple-values.xml");
		genericXmlApplicationContext.refresh();
		InjectSimple injectSimple = (InjectSimple)genericXmlApplicationContext.getBean("injectsimple");
		System.out.println(injectSimple);
		genericXmlApplicationContext.close();

	}

	@Override
	public String toString() {
		return name + " " + surname + " " + age;
	}

}

InjectSimple sınıfı içerisinde name, surname ve age adında üç paramtre ve bunların get-set metotlarını tanımlıyoruz. Main metodu içerisinde de injecting-simple-values.xml dosyasını yükleyip içerisinden injectsimple bean’ini çağırıyoruz. Son olarak da çağırdığımız bean’den oluşan nesneyi konsola yazdırıyoruz.

injecting-simple-values.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context
          				http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="com.ilkaygunel.springtutorials.injectingsimplevalues" />
	<bean id="injectsimple"
		class="com.ilkaygunel.springtutorials.injectingsimplevalues.InjectSimple"
		p:name="Onur" p:surname="Özcan" p:age="23"/>
</beans>

injecting-simple-values.xml dosyasında InjectSimple sınıfını kullanarak injectsimple id’li bean’i tanımlıyoruz. Bu tanımlama sırasında da p: ifadeleri ile sınıf içerisindeki alanları çağırarak değerler atıyoruz. Örneğin name alanı için p:name=”Onur” şeklinde bir atama yapıyoruz.

Ekran Çıktısı

Ekran çıktısında görebildiğimiz gibi XML içinde tanımlı değerler injectsimple değişkenine set edildi.

Spring bize ayrıca XML kullanmadan direk sınıf içerisinde de değer ataması yapma imkanı sunar. Hemen bunu örneklediğimiz sınıfımıza bakalım. Öncelikle yukarıdaki XML içerisindeki injectsimple id’li bean tanımlamasını silelim.

package com.ilkaygunel.springtutorials.injectingsimplevalues;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.stereotype.Service;

@Service("injectsimple")
public class InjectSimple {
	@Value("Alican")
	private String name;
	@Value("Akkuş")
	private String surname;
	@Value("24")
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public static void main(String[] args) {
		GenericXmlApplicationContext genericXmlApplicationContext = new GenericXmlApplicationContext();
		genericXmlApplicationContext.load("injecting-simple-values.xml");
		genericXmlApplicationContext.refresh();
		InjectSimple injectSimple = (InjectSimple)genericXmlApplicationContext.getBean("injectsimple");
		System.out.println(injectSimple);
		genericXmlApplicationContext.close();
	}
	
	@Override
	public String toString() {
		return name + " " + surname + " " + age;
	}
}

Sınıf içerisinde @Service(“injectsimple”) satırı ile sınıfımızı XML’de yer almaksızın Spring’e kaydettirdik. Her bir değişkenimizi ise @Value notasyonu ile işaretleyip notasyona verilen değerler ile atama yapıyoruz. Main metodu içerisinde de her ne kadar bean’imiz içerisinde tanımlı olmasa da XML’i çağırıp yüklüyoruz ve ardından injectsimple değişkenimizi oluşturup konsola yazdırıyoruz.

Injecting Values by Using SpEL

Spring 3’den itibaren Spring içerisine değerleri Spring Expression Language ile inject etme imkanı getirilmiş. İster XML yolu ile ister de notasyon yolu ile bir bean içindeki alanlar SpEL ile diğer bean içerisinde inject edilebiliyor. Şimdi bu işlemin nasıl yapıldığına bakalım.

InjectSimpleConfig.java

package com.ilkaygunel.springtutorials.spelinjecting;

public class InjectSimpleConfig {
	private String name="ilkay";
	private String surname= "günel";
	private int age=24;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return name + " " + surname + " " + age;
	}
}

InjectSimpleConfig sınıfı içerisinde name, surname ve age alanalrının tanımı ve onlara ait get-set metotları yer alıyor. Sınıf içerisinde alanalrın ataması baştan yapılmış vaziyette.

InjectSimpleSpel.java

package com.ilkaygunel.springtutorials.spelinjecting;

import org.springframework.context.support.GenericXmlApplicationContext;

public class InjectSimpleSpel {
	private String name;
	private String surname;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {

		return name + " " + surname + " " + age;
	}
	
	public static void main(String[] args) {
		try {
			GenericXmlApplicationContext genericXmlApplicationContext = new GenericXmlApplicationContext();
			genericXmlApplicationContext.load("injectspel.xml");
			genericXmlApplicationContext.refresh();
			
			InjectSimpleSpel injectSimpleSpel = (InjectSimpleSpel) genericXmlApplicationContext.getBean("injectsimplespel");
			System.out.println(injectSimpleSpel);
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}

InjectSimpleSpel sınıfı InjectSimpleConfig sınıfındaki ön tanımlı değerleri az sonra XML içerisinde inject edeceğimiz sınıf. Gördüğümüz gibi InjectSimpleConfig ile aynı alanlara sahip.

injectspel.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context
          				http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="com.ilkaygunel.springtutorials.spelinjecting" />
	<bean id="injectsimpleconfig"
		class="com.ilkaygunel.springtutorials.spelinjecting.InjectSimpleConfig"></bean>
	<bean id="injectsimplespel"
		class="com.ilkaygunel.springtutorials.spelinjecting.InjectSimpleSpel"
		p:name="#{injectsimpleconfig.name}" p:surname="#{injectsimpleconfig.surname}"
		p:age="#{injectsimpleconfig.age}"></bean>
</beans>

injectspel.xml dosyası içerisinde 2 adet bean tanımı var. Bunlardan birisi default değerlerin tanımlı olduğu InjectSimpleConfig sınıfını tanımlayan injectsimpleconfig bean’i, diğeri ise InjectSimpleSpel sınıfını tanımlayan injectsimplespel bean’i. Spring Expression Language adı verilen ifade içerisinde #{} ifadesi ile bizler başka bir bean içerisinde değeri alabiliyoruz. Örneğin burada p:name=”#{injectsimpleconfig.name}” ifadesi injectsimpleconfig bean’inden name alanını al ve injectsimplespel bean’indeki name alanına ata demektir.

Main metodu olan sınıfı çalıştırdığımda sonuç şöyle:

Bu yazı için son olarak da notasyonla bu işi nasıl yapabildiğimize bakalım.

Yukadıraki XML’de yer alan injectsimplespel id’li bean tanımını silelim ve InjectSimpleSpel sınıfımızı şu şekilde güncelleyelim:

package com.ilkaygunel.springtutorials.spelinjecting;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.stereotype.Service;

@Service("injectsimplespel")
public class InjectSimpleSpel {
	@Value("#{injectsimpleconfig.name}")
	private String name;
	
	@Value("#{injectsimpleconfig.surname}")
	private String surname;
	
	@Value("#{injectsimpleconfig.age}")
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {

		return name + " " + surname + " " + age;
	}
	
	public static void main(String[] args) {
		try {
			GenericXmlApplicationContext genericXmlApplicationContext = new GenericXmlApplicationContext();
			genericXmlApplicationContext.load("injectspel.xml");
			genericXmlApplicationContext.refresh();
			
			InjectSimpleSpel injectSimpleSpel = (InjectSimpleSpel) genericXmlApplicationContext.getBean("injectsimplespel");
			System.out.println(injectSimpleSpel);
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
}

InjectSimpleSpel sınıfımızı @Service notasyonu ile işaretledik ve XML’e kaydettirmeden kullanıma hazır hale getrdik. Az önce XML dosyasında yaptığımız gibi #{} ifadesini @Value notasyonu içerisinde kullanarak aynı şekilde injectsimpleconfig üzerinden diğer bean’deki alanlara ulaşarak onları kendi bean’imize set ettik. Main metodu içerisinde de injectSimpleSpel nesnesini çağırarak ekrana yazdırdık. Sonuç da şu şekilde:

Bu yazıda anlatacaklarım bu kadar arkadaşlar. Simple Value Injection konusunu öğrenmiş olduk. Başka yazıda görüşmek üzere.

Görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle