Spring Framework XML ile Konfigürasyon
Yazılım teknolojilerinde konfigürasyon işlemlerinde büyük çoğunlukla XML teknolojilerinden faydalanılmaktadır. Bunu Java programlama dili için düşünürsek, Apache Maven aracı için pom.xml, Web uygulamaları için web.xml, JavaServer Faces için faces-config.xml gibi yapılandırıcı dosyalar konfigürasyon maksatlı kullanılmaktadır .
Spring Framework’ de XML ve Java tabanlı yapılandırıcılarla kendi ekosistemini geliştiricilere açmaktadır. XML tabanlı Spring yapılandırıcılar genel olarak aşağıdaki işlemlere imkan sunmaktadır.
- IOC konteyner’in yöneteceği nesnelerin (Spring Bean) tanımlanması,
- Spring nesneleri arasındaki bağın kurulması (Setter veya Constructor Injection ile),
- Tanımlı nesnelere dönük veri alanlarının düzenlenmesi,
- Örneğin bir Datasource nesnesinin url, username, password gibi alanlarının düzenlenmesi.
- Yetkilendirme yapılması,
- Şu paket içindeki tüm sınıflarda Spring notasyonları taransın
- Transaction yönetimi aktifleştirilsin
- Notasyon kullanımı aktifleştirilsin
- AspectJ proxy kullanımı aktifleştirilsin, gibi.
Spring Framework’ün 3.0 versiyonu ile beraber, XML tabanlı yapılandırmaya alternatif olarak Java sınıfları üzerinden yapılandırma desteği de getirildi. An itibariyle XML tabanlı yapılandırıcılarda yapılabilen herşey, aynı zamanda Java taraflı konfigürasyon sınıflarında da yapılabilmektedir. Hangisi daha iyi, hangisi kullanılmalı gibi konuları sizlere bırakıyor ve kullanım örneklerini paylaşmak istiyorum.
Paylaşacağımız uygulamada Arac arayüzü türünden bir Araba sınıfı ve Arac arayüzü türünden nesneleri yöneten Galeri sınıfı bulunmaktadır.
public interface Arac {
public void calis();
}
Arac olduğunu iddaa eden her sınıf, çalışmalıdır.
public class Araba implements Arac {
@Override
public void calis() {
System.out.println("Araba çalışıyor..");
}
}
Araçlar yönetilirken galerilerden faydalanılabilir.
public class Galeri {
private Arac arac;
public Arac getArac() {
return arac;
}
public void setArac(Arac arac) {
this.arac = arac;
}
}
UML diagramına bakıldığında, Spring nesnesi olma adayı olarak 2 sınıf gösterilebilir. Araba ve Galeri. Şimdi bu nesneleri XML ve Java taraflı konfigürasyonlarla yönetebiliriz.
Yöntem 1
Spring konteynerin yöneteceği nesneler XML elemanları olarak yapılandırılır. Nesneler arası bağ, Setter veya Constructor enjeksiyonu ile kurulur. Setter Injection “property” elemanı ile sağlanırken, Constructor Injection ise “constructor-arg” elemanı ile sağlanmaktadır.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="araba" class="com.kodcu.xml.Araba"/>
<bean id="galeri" class="com.kodcu.xml.Galeri">
<!-- Setter Injection -->
<property name="arac" ref="araba"/>
</bean>
<!-- Alternatif - Constructor Injection
<bean id="galeri" class="com.kodcu.xml.Galeri">
<constructor-arg ref="araba"/>
</bean>
-->
</beans>
Eşsiz ID değerleri araba ve galeri olan bu nesne deklaresyonları, Spring konteyner ayaklandığında, Spring konteyner üzerinde yönetimli nesneler olarak yaşamaya başlarlar. Spring konteyner üzerinde hazır olarak bekleyen bu nesneler, ApplicationContext arayüzü tipinden nesnelerle elde edilir. Zaten Spring konteyneri ayaklandırma işlemini de ApplicationContext arayüzü türünden nesneler sağlamaktadır. ApplicationContext türünden çeşitli soyut ve somut sınıflar bulunmakla birlikte, en çok kullandığımız 3 ApplicationContext nesne türünü aşağıdaki resim görebilirsiniz.
ClassPathXmlApplicationContext : ClassPath içinde bulunan bir XML konfigürasyon dosyası üzerinden, Spring konteyneri yapılandırma ve yönetme işlerini sağlar.
FileSystemXmlApplicationContext : Dosyalama sisteminin herhangi bir konumunda bulunan bir XML konfigürasyon dosyası üzerinden, Spring konteyneri yapılandırma ve yönetme işlerini sağlar.
AnnotationConfigApplicationContext : Notasyon uygulanmış sınıflardan veya Java konfigürasyon sınıfları üzerinden, Spring konteyneri yapılandırma ve yönetme işlerini sağlar.
Peki Yöntem 1 kısımındaki XML kütüğü kullanılarak Spring konteyner nasıl başlatılır ve konteyner üzerinden nesneler nasıl elde edilebilir?
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config-xml.xml");
Galeri galeri = context.getBean("galeri", Galeri.class);
//Galeri galeri = context.getBean(Galeri.class);
//Galeri galeri = (Galeri) context.getBean("galeri");
galeri.getArac().calis();
veya
ApplicationContext context =
new FileSystemXmlApplicationContext("src/main/resources/spring-config-xml.xml"); Galeri galeri = context.getBean("galeri", Galeri.class);
//Galeri galeri = context.getBean(Galeri.class);
//Galeri galeri = (Galeri) context.getBean("galeri");
galeri.getArac().calis();
Bu örnek kodlar çalıştırıldığında spring-config-xml.xml dosyası üzerinden Spring konteyner ayaklanır ve Galeri nesnesi üzerinden Araba nesnesini koşturmuş olur.
Eyl 15, 2013 10:28:06 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@506c589e: startup date [Sun Sep 15 10:28:06 EEST 2013]; root of context hierarchy Eyl 15, 2013 10:28:06 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [spring-config-xml.xml] Eyl 15, 2013 10:28:07 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6bf256fa: defining beans [araba,galeri]; root of factory hierarchy Araba çalışıyor..
Yöntem 2
Spring konteyner başlatılırken XML yapılandırıcı kullanılabilir fakat Spring nesnesi tanımlama ve enjeksiyon işlemleri notasyonlar ile sağlanabilir. Spring nesneleri XML yapılandırıcılarda deklare edildiği gibi, notasyonlar ile de deklara edilebilir. Örneğin;
@Component
public class Araba implements Arac {
@Override
public void calis() {
System.out.println("Araba çalışıyor..");
}
}
@Component notasyonu uygulanan her bir Java sınıfı, Spring konteyner tarafından yönetilebilir bir nesne adayı olma yeteneğine sahip olur. Fakat, yapılandırma işlemlerinde eğer notasyonlar kullanılacaksa, Spring konteyner bu konu hakkında bilgilendirilmelidir, yetki verilmelidir.
<?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:context="http://www.springframework.org/schema/context"
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.kodcu.not"/><!--(1)-->
</beans>
Örneğin yukarıdaki XML yapılandırıcısında, (1) adet yetki bildirimi tanımlanmaktadır. Bu yetkilendirme bir paket dizini altındaki notasyon uygulanmış sınıfları tarama yetkisi vererek, notasyonların kullanılmasını aktifleştirmektedir. Örneğin @Component, @Repository, @Autowired ve @PersistenceContext gibi. Bu ifade konteynere yetki verme bağlamında düşünülebilir.
Notasyon bazlı nesne tanımlamada, Galeri sınıfı ise aşağıdaki biçimde kullanılabilir.
@Component
public class Galeri {
@Autowired // Araba komponentini buraya eriştirir
private Arac arac;
public Arac getArac() {
return arac;
}
public void setArac(Arac arac) {
this.arac = arac;
}
}
@Component notasyonu Galeri sınıfına bir Spring Bean olabilme özelliği katarken, @Autowired notasyonu ise, konteyner üzerinde bulunan Arac arayüzü türünden bir nesneyi, global [ private Arac arac; ] alanına enjeksiyon yöntemiyle eriştirir. Bu uygulama da bir önceki yöntemde olduğu gibi aşağıdaki biçimde işletilebilir.
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config-not.xml");
Galeri galeri = context.getBean("galeri", Galeri.class);
galeri.getArac().calis();
Uygulama çıktısı bir önceki yöntemdeki gibi olmaktadır. Bu yazıda XML konfigürasyon dosyaları üzerinden yapılandırma sağlarken, önümüzdeki günlerde yayınlanacak yazıda Java sınıfları üzerinden yapılandırma örnekleri paylaşılacaktır.
Uygulama örneklerine bu bağlantıdan erişebilirsiniz.
Tekrar görüşmek dileğiyle.
1 Comment