Ensar Basri Kahveci

overly distributed

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

Posted at — Jul 10, 2011

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 container’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 metadata’sı üzerinde çalışmaları için otomatik olarak işletiyor. Birden fazla BeanFactoryPostProcessorumuz 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 dataSourceun ü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 namespacei 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 attributelara 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.

comments powered by Disqus