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 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.