Merhaba Arkadaşlar, Bu yazımızda sizlerle Java Bean ve Spring Bean nedir, nasıl kullanılır ve aralarındaki farklar nelerdir gibi konuları ele alacağız. Bu yazıya gelirken, konu hakkında birçok makale okuduğunuzu ve muhtemelen kafanızın biraz karışmış olduğunu varsayıyorum. Ancak hiç merak etmeyin aslında Java Bean ve Spring Bean kavramları oldukça basit ve anlaşılması kolay. Bu makalede, konuyu mümkün olduğunca basit bir şekilde ele alarak, Java Bean ve Spring Bean kavramlarını sizlere net bir şekilde anlatmaya çalışacağım. Eminim ki bu makaleyi okuduktan sonra, Java ve Spring dünyasındaki Bean kavramlarının ne olduğunu çok daha iyi anlayacaksınız.
Java Bean Nedir ?
Öncelikle söylemem gereken şey Bean dediğimiz şey aslında bir standarttır. Constructor, function, method veya return gibi bir özellik değildir. Burada ki standart cümlesini biraz açalım.
Örneğin içinde metodlar bulunan, özellikler bulunan class anahtar sözcüğü ile başlayan yapılara sınıf diyoruz değil mi ? Yine içinde sadece metotların isimleri bulunan ama metodların gövdesinin boş olduğu sınıflarada interface diyoruz. Yani burada bir sınıfa interface, abstract vs gibi dememizin nedeni sınıfın hangi özelliklere sahip olduğu ve ne iş yaptığı ile alakalı. İşte tıpkı burada ki gibi: Serializable sınıfından implement olan, özellikleri private olarak tanımlanan, parametresiz bir constructor bulunduran, getter ve setter metodları olan sınıflara Java Bean denir.
Şimdi bu bahsettiğimiz özellikleri içeren çok basit bir sınıf yazalım Java Bean nedir daha iyi anlamaya çalışalım.
public class Kisiler implements Serializable { private String ad; private int yas; private String cinsiyet; public Kisiler() { } public String getAd() { return ad; } public void setAd(String ad) { this.ad = ad; } public int getYas() { return yas; } public void setYas(int yas) { this.yas = yas; } public String getCinsiyet() { return cinsiyet; } public void setCinsiyet(String cinsiyet) { this.cinsiyet = cinsiyet; } }
Kisiler sınıfımızın bir Java Bean sayılabilmesi için aşağıdaki şartları sağlaması gerekir.
- Serializable sınıfından implement olmuş mu ?
- Özellikleri private tanımlanmış mı ?
- Parametresiz constructor içeriyor ?
- getter ve setter metodları var mı ?
Örneğimizde ki Kisiler sınıfımız tüm şartları sağladığına göre bu sınıfımız bir Java Bean sınıfıdır.
Java Bean kafamızda oturduysa şimdi biraz daha bu konunun detaylarına bakalım.
Peki neden ?
Java Bean standartı genellikle veri saklamak, veriye erişmek veya manipüle etmek için kullanılan basit bir yapıdır. Bildiğiniz gibi Java çok büyük bir dil. Bir çok paket, kütüphane ve modülden oluşuyor. Bu yüzden Java dilinde oluşturulan paketlerin, kütüphanelerin ve sınıfların bir standartı olmak zorunda. Aksi takdirde kodların anlaşılması, kullanılması ve bakımının yapılması zorlaşır.
Yukarıdaki örneğimize baktığımızda bu sınıfımız hiç bir sınıfa bağımlı değil. Yani tek başına herhangi bir Java uygulaması içinde çalışabilir. İsterseniz Java EE’de, Spring’de, Hibernate’de yada herhangi bir yerde çalıştırabilirsiniz.
Bean standartı Java dilinde standart sınıf ve nesne yapılarını tanımlamak için geniş bir şekilde kullanılıyor. Özellikle Java EE gibi büyük ölçekli uygulamalarda bileşenler arası uyumu sağlamak için Java Bean standartı çok çok önemli.
Buradaki yazımda Java’nın Hikayesinden bahsetmiştim. Hatırlarsanız Java ismi aslından kahveden geliyordu. Hmmm. Bean’de kahve çekirdeğinden mi geliyor yoksa ? Aynen öyle arkadaşlar. Nasıl küçük küçük çekirdekler bir araya gelip kahveyi oluşturuyorsa, bizim küçük küçük bean sınıflarımızda bir araya gelip kütüphaneleri programları oluşturuyor.
Java Bean kavramının ne olduğuna baktığımıza göre şimdi spring bean kavramına geçebiliriz.
Spring Bean nedir ?
Spring Framework Bean kavramı az önce bahsettiğimiz Java Bean standartından biraz farklı. Buradaki Bean kavramını anlayabilmek için Spring Container, IoC, Dependency Injection konularını iyi anlamış olmak gerekir. Spring kullanıyorsanız bunları zaten bildiğinizi varsayıyorum.
Spring’deki bir bean, Spring Container tarafından yönetilen ve Spring uygulaması içinde kullanılan herhangi bir nesneyi ifade eder. Bu bahsettiğimiz nesneler Spring tarafından oluşturulur ve yönetilir. Bu tanımdan yola çıkarak Spring’deki Bean kavramının Java Bean ile pek alakası olmadığını düşünebilirsiniz ancak burada bahsettiğimiz nesneler Java Bean standartlarına uygun olarak tasarlanır ve kullanılır.
Spring’deki bir bean tanımlamak için @Component anotasyonu kullanılır. Yada bunun yerine XML kullanarak tanımlanır. Geliştiriciler olarak hiçbirimiz XML sevmediğimiz için anotasyon üzerinden bir örnek verelim.
package com.emrtnm.blog; import org.springframework.stereotype.Component; @Component public class SpringBean { public void selam() { System.out.println("Spring Bean"); } }
Örneğimize baktığımızda @Component anotasyonu ile kullanıldık ve selam adında bir metod ekledik. Dediğim gibi bu anotasyonu kullanarak Spring Container’a bu sınıfın bir Bean olduğunu söylemiş oluyoruz.
Peki Java Bean deki parametresiz constructor gibi şartlara ne oldu ?
@Component anotasyonu ile kullandığımız için spring arka planda bu nesneye parametresiz bir constructor zaten ekledi.
Peki ya getter ve setter metodlarına ne oldu ?
Yine burada bir fark söz konusu. Java Bean standartında özelliklerimizi private olarak tanımlıyorduk ancak Spring Bean’de private olarak tanımlanan değişkenlere Spring erişemeyeceği için otomatik olarak getter ve setter oluşturulmayacak. Tanımladığımız özelliğin getter ve setterlarının otomatik olarak oluşturulmasını istiyorsak public olarak tanımlamalıyız.
Spring Framework’de nesne olarak bean kullanımı çok tercih edilen bir yöntem değildir daha çok bean metod olarak kullanılır.
Bean metod nedir ?
Yukarıda bahsettiğimiz gibi Spring Container tarafından yönetilen nesnelere bean diyoruz ancak bazı durumlarda spring uygulamamıza esneklik katmak, yapılandırmak veya farklı stratejiler uygulamak için bean metodlarada ihtiyaç duyabiliriz. Spring eğitimlerinde yada YouTube videolarında gördüğünüz Beanler genellikle yapılandırma amacıyla tanımlanır. Çünkü genel olarak Spring Framework’de beanleri yapılandırma amacıyla kullanıyoruz.
Bean bir metod tanımlamak için @Bean anotasyonunu kullanırız ve sınıfımızda @Configuration anotasyonu ile tanımlanır. @Configuration anotasyonu zorunlu değildir ancak Spring içinde beanler çoğunlukla yapılandırma amacıyla kullanıldığı için @Configuration anotasyonu ile birlikte kullanılır. Ayrıca bu anotasyon Spring Container’a Bean tanımlaması sağlayan özel bir sınıftır.
Şimdi yukarıdaki SpringBean örneğimizi referans alarak bean metod tanımlayalım daha sonrada detaylarına bakıp yazımızı sonlandıralım.
@Configuration public class Application { @Bean public SpringBean springBean() { return new SpringBean(); } }
Bu kodda aslında Spring Container’a şunu demiş olduk. Application sınıfım SpringBean sınıfına bağımlı. Sen kodları çalıştırmadan önce bir SpringBean nesnesini oluştur ve bu nesnenin referans numarasını hafızada tut. İhtiyacım olduğunda bu referans numarasından bana nesnenin bir örneğini (instance) ver. Böylelikle aradaki dependency injection olayını ben sana bırakıyorum.
Özetle
Java Bean standart bir yapıyı ifade ederken, Spring Bean Spring Framework içinde Spring Container tarafından yönetilen herhangi bir nesneyi ifade eder.
Java Bean veri saklamak, veri işlemek veya manipüle etmek için kullanılırken, Spring Bean Spring uygulamasını yapılandırmak, esneklik katmak, bileşenler ve logic için kullanılır.
Her iki Bean kavramıda nesne tabanlı programlama prensiplerine uygun olarak tasarlanmış, yeniden kullanılabilir, bakımı ve anlaşılması kolay, geliştiricilere uygulama geliştirmede kolaylık sağlayan standartlardır.
Umarım faydalı olmuştur. Eklemek istediklerinizi veya burada bir yanlışlık var burayı düzeltirsek insanlara daha faydalı olmuş oluruz dediğiniz kısımları yorum olarak veya direk olarak bana iletebilirsiniz.
Bir sonraki yazımızda görüşmek üzere…
İlk Yorumu Siz Yapın