Bugünkü yazımda çok basit ve temel anlamda Spring ile XML tanım tabanlı bean okuma işlemini anlatmaya çalışacağım. Spring framework bizim yerimize nesnelerin birbirine olan bağımlılıklarını düzenleyip, oluşturup, bize hazır nesneler sunmaktadır. İlk olarak çok basit bir log arayüzü ve sınıfımız var. Log sınıfımızdan tüm uygulama boyunca sadece ve sadece bir nesne oluşturulmasını istiyoruz. Böylece tüm uygulama boyunca aynı referans kullanılacaktır. Tasarım şablonları ile aşina olanlarımız bunun bir singleton şablonu olduğunu anlayacaktır. Aslında Spring frameworke ihtiyaç duymadan bu işi kendimiz de kodlayabiliriz; ama buradaki amacımız framework özelliklerini anlamak. Şunu da belirtmek isterim ki XML dosyasında ayrıca bir tanım yapmamışsanız tüm nesneler singleton olarak oluşturulur. Şimdi de prototype bir sınıf yazalım. Yani bean için her talebimizde Spring bize o sınıftan yeni bir nesne döndürecektir.
Aslında çok da işlevi olmayan bir sınıf; ama Spring in bazı yeteneklerini göstermek adına başlangıç için ideal olduğunu düşünüyorum. Şimdi de uygulama sırasında okunması için vereceğimiz ve bean tanımlarının olduğu XML dosyası. <bean id="singletonbean" class="anajavatica.spring.bean.xml.springsysoutloggerimpl" scope="singleton" /> Olayın büyük bir kısmı bean tagi içerisinde yer alıyor. İd tagi ile o bean için erişilebilir bir ad veriliyor ve kod tarafında çekmek istediğimizde bu id kullanılacaktır. Class ise hangi sınıftan nesne oluşturulmak istendiğini belirtir. Package adı ile beraber yazıldığına dikkat etmemiz lazım. Scope ise ilk kısımda değindiğim nesnenin geçerlilik alanını belirtmektedir. Bu bean bizim için tekil olacaktır ve tüm uygulama boyunca aynı nesne kullanılacaktır. Başka bir nesne daha oluşturulmayacaktır. <bean id="prototypebeanwithmethod" class="anajavatica.spring.bean.xml.prototypebean" init-method="initialize" destroy-method="clear" scope="prototype"> <property name="springlogger" ref="singletonbean" /> </bean> Yeni bir bean tanımı daha karşımıza çıkıyor. Burada ek olarak bazı özellikler daha var. İnitmethod ile bu metodun otomatik çağrılması sağlanacaktır ve böylece nesnemiz başlangıç değerlerini alacaktır. Bu metot ismi tamamen size kalmış. Destroy-method ile de nesne kullanımı bittikten sonra neler yapılacağı belirtiliyor. Örneğin veritabanı bağlantısı kapatmak, kaynakları serbest bırakmak, çıkış işlemi yapmak gibi. Bu bean için scope değerimiz prototype, yani bu bean için her talep geldiğinde Spring bize yeni bir tane nesne new edip sunacaktır.
Son olarak sınıf içerisinde var olan springlogger alanına daha önceden tanımladığımız diğer bean örneğini otomatik bağlayacaktır. <bean id="prototypebeanwithconstructor" class="anajavatica.spring.bean.xml.prototypebean" init-method="initialize" destroy-method="clear" scope="prototype"> <constructor-arg> <ref bean="singletonbean" /> </constructor-arg> <constructor-arg name="info" value="prototype Bean Info" /> <property name="numberlist"> <list> <value>10</value> <value>20</value> <value>30</value> </list> </property> <property name="numbermap"> <map> <entry key="one" value="1" /> <entry key="two" value="2" /> <entry key="three" value="3" /> </map> </property> </bean> Constructor-arg ile constructor için parametre değerleri dışarıdan gönderilmiş olunur. Bunları name ile atayabildiğimiz gibi index veya id değerleri ile de atayabiliriz. Daha sonra List ve Map türündeki alanları dışarıdan değerler göndererek dolduruyoruz. Bu tür property set etme işlemlerini veritabanı bağlantı bilgileri sağlama, tercihleri değiştirmek gibi işlemlerde kullanabiliriz. Son olarak da main sınıfı. Önce springbean.xml dosyasını vererek gerekli ayarların ve tanımların okunmasını sağlıyoruz. Sonra da sırası ile prototype ve singleton nesnelerimizi çağırıp çeşitli işlemler yapıyoruz. Bu main sınıfının çalışması sonucunda oluşan çıktı şuna benzeyecektir.
Gördüğünüz gibi prototype nesneler her defasında farklı bir referans ile karşımıza çıkarken, singleton nesneler hep aynı referans ile karşımıza çıkıyorlar. Yani tek bir nesne oluşuturulmuş olunuyor. Bol Java lı günler dileğiyle