<-- home

Spring ile konfigürasyon değerlerini property dosyalarına almak

Başlık konusunda çok sıkıntı çekiyorum ya. Spring, bize IoC container’ını genişletmek (extend) için çeşitli entegrasyon arayüzleri (interface) ve bu arayüzlerin -out of the box- gerçekleştirimlerini (implementation) sunuyor. BeanPostProcessor bunlardan biri. BeanPostProcessor kullanarak, Spring conteiner’i bir bean’i yaratıp ilklendirdikten (initialize) sonra, bean üzerinde istediğimiz işlemleri gerçekleştirebiliyoruz. Önceki yazılardan birinde bahsettiğim Spring ile Logger enjektesi, bunun bir örneği. BeanPostProcessor gerçekleştirimlerinin bir diğer örneği ise Spring ile gelen RequiredAnnotationBeanPostProcessor sınıfı.

BeanFactoryPostProcessor arayüzü ise, Spring IoC container’ının bir başka genişleme noktası. Bu arayüz sayesinde konfigürasyon metadata’sı üzerinde çalışabiliyoruz. Spring IoC container’ı bean’leri yaratmaya başlamadan önce BeanFactoryPostProcessor  gerçekleştirimlerine konfigürasyon metadata’larını okuma ve değiştirme imkanı sağlıyor.

ApplicationContext, içerisinde tanımlanan BeanFactoryPostProcessor gerçekleştirimlerini otomatik olarak saptayıp konfigürasyon metadatası üzerinde çalışmaları için otomatik olarak işletiyor. Birden fazla BeanFactoryPostProcessor’umuz varsa ve işletim sırası önemliyse order değeri ile işletim sıralarını da ayarlayabiliyoruz.

Yazının asıl mevzusu ise, Spring ile gelen ve esasında BeanFactoryPostProcessor arayüzünün bir gerçekleştirimi olan PropertyPlaceHolderConfigurer sınıfı. PropertyPlaceHolderConfigurer sınıfı sayesinde, kodumuza yönelik konfigürasyon parametrelerini bean tanımlarından ayırıp standart java property dosyalarına koyabiliyoruz. JDBC parametreleri mesela. Böylelikle parametrelerde bir değişiklik yapacağımız zaman bean tanımlarıyla uğraşmak yerine property dosyalarından kolayca değişiklikleri hallediyoruz.

Şu örnek XML parçasına bir bakalım:

<bean>
<property name="locations" value="classpath:com/foo/jdbc.properties"/>
</bean>

<bean id="dataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

dataSource bean’inin property’lerinde, gerçek değerler yerine placeholder değerler verilmiş. Placeholder’ların yerine de dataSource’un üstünde tanımlanan PropertyPlaceHolderConfigurer bean’i property dosyasından okuduğu değerleri yerleştiriyor. Örnek olarak jdbc.properties dosyasında bulunan

jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

değerleri, Spring IoC’u bean’leri yaratmaya başlamadan önce, placeholder değerlerine yerleştiriliyor.

Spring 2.5 ile gelen context namespace’i ile, PropertyPlaceHolderConfigurer tanımlamasını

<context:property-placeholder location="classpath:com/foo/jdbc.properties"/>

şeklinde yapabiliyoruz. location değeri ise  virgül ile ayrılmış birden fazla property dosyası alabiliyor.

Ayrıca, Annotation kullanarak yaptığımız konfigürasyonda ise, bean’imiz içinde

@Value(“${propertyName}”)

annotation’u ile konfigürasyon değerlerini attribute’lara alabiliyoruz. Bu kullanım adeta beni benden aldı :D Upload edilen bir resmi bir dizine yazıyordum, ama hangi dizine yazılacağını bean içinde amele gibi tanımlamak yerine, konfigüre edilebilir bir şekilde nasıl yaparım derken, bu olayı kurcalayıp keşfettim.