Merhaba arkadaşlar, bu yazımda ilk spring projemizi oluşturacağız ve DI(Dependency Injection) kavramını inceleyeceğiz.
Dependency Injection(DI) Nedir Ve Çeşitleri Nelerdir?
İlişkili olan nesnelerin birbirleri arasındaki ilişkiyi daha iyi yönetmek için kullanılır. Yani daha açık bir tanım yapılmak istenirse: projeler büyüdüğünde yönetilmesi zorlaşır, projede yapılan küçük bir değişiklik projeyi çöpe çevirebilir çünkü yapılan değişiklik birden fazla nesneyi etkileyebilir. Bu etkilenmeyi en aza indirmek için DI kullanılır. DI iki şekilde uygulanır:
- Constructor Injection(Constructor Based Dependency Injection)
- Setter Injection(Setter Based Dependency Injection)
Spring Hello World
Eclipse IDE’mizde spring projesi başlatmak için File->New->Java Project diyerek proje başlatalım. Oluşturduğumuz projemize maven dependencies eklemek için projemize sağ tıklayarak Configure-> Convert To Maven Project diyerek projemizi maven projesine dönüştürelim ve ilk derste yazdığım dependencyleri ekleyelim.
1-)Constructor Injection
Address.java
1 2 3 4 5 6 7 8 9 |
public class Address { private String street; private int no; public Address() { System.out.println("Adres Yapıcısı Çalıştı"); } //Getters and Setters |
Person.java
1 2 3 4 5 6 7 8 9 10 |
public class Person { private String name; private int age; private Address address; public Person(Address address) { this.address=address; } //Getters and Setters Test.java |
1 2 3 4 5 |
public class Test { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("_002_application.xml"); Person person=(Person)applicationContext.getBean("person"); |
Şimdi projemize sağ tıklayalım ve spring tools eklentisinden gelen bean.xml dosyasını projemize ekleyelim:
_002_application.xml
1 2 3 4 5 |
<bean id="person" class="_002_dependency_Injection.Person"> <constructor-arg type="_002_dependency_injection_xml.Address" ref="address"/> </bean> <bean id="address" class="_002_dependency_injection_xml.Address"></bean> |
Person ve Address sınıflarımız bizim bean sınıflarımızdır. Person sınıfımızın yapısı Address nesnesini parametre olarak alıyor ve Address sınıfı ile ilişki oluşturuyor. _002_application.xml dosyamızda beanlerimiz tanımlanıyor.
1 |
<bean id="person" class="_002_dependency_Injection.Person"> |
Burada id özelliğine her beane ayrı değer veriliyor. Class özelliğine paketAdı.sınıfAdı şeklinde sınıfımız belirtiliyor.
1 |
<constructor-arg type="_002_dependency_injection_xml.Address"ref="address"/> |
Hangi bean tagları içerisinde tanımlanıyorsa o sınıf içerisindeki Address türündeki parametre alan yapıcıyı temsil eder.
Ref özelliği=>tanımlanan beanler arasından id ile sınıf referans gösterilir. Yani burada yapıcının parametresine hangi bean atanacaksa o belirtilmiştir.
Şimdi Test sınıfımızdaki nesneleri tanıyalım:
ApplicationContext Sınıfı
ApplicationContext, uygulamaya konfigürasyon bilgileri saklamak için bir Spring uygulamasındaki merkezi arayüzdür. Çalışma zamanında salt okunurdur, ancak gerekirse uygulama tarafından desteklenip yeniden yüklenebilir. Bir dizi sınıf, çeşitli yapılandırma seçeneklerine ve uygulama türlerine izin vererek ApplicationContext arayüzünü uygular.
ApplicationContext Sınıfının Görevleri
- Uygulama bileşenlerine erişim için Bean Factory yöntemleri
- Dosya kaynaklarını genel bir şekilde yükleyebilme
- Olayları kayıtlı dinleyicilere yayınlama yeteneği
- Uluslararasılaştırmayı desteklemek için mesajları çözme yeteneği
- Üst bağlamdan kalıtım sağlama.
Oluşturulan application.xml dosyamız tanımlanıyor ve projemize yükleniyor. Daha sonra Person sınıfından nesne üretiliyor ve getBean(“beanID”) metodu ile bean çağrılıyor ve nesnemize atanıyor. Bu şekilde görüldüğü gibi Person sınıfındaki parametreli yapıcı sayesinde Address sınıfı ile ilişki kurulmuş oldu.
2-)Setter Injection
Yukarıdaki sınıflar aynı şekilde tanımlanıyor. Sadece application.xml dosyamızı aşağıdaki gibi güncelliyoruz:
1 2 3 4 5 |
<bean id="person" class="_002_dependency_injection_xml.Person"> <property name="address" ref="address"></property> </bean> <bean id="address" class="_002_dependency_injection_xml.Address"></bean> |
Burada <property> etiketlerimiz set metotlarımızıı temsil ediyor.
Name özelliği => Set metodunun aldığı parametrenin adını temsil eder. Bu uygulamada
1 2 3 |
public void setAddress(Address address) { this.address = address; } |
Görüldüğü gibi set metodu kullanılarak DI yapılmış oldu. Spring Core framework de DI(Dependency Injection) yapmış olduk. Bu yazımı burada bitiriyorum diğer yazılarımda görüşmek üzere…