Bu bölümde IoC prensibinin ne olduğundan ve Spring ile olan ilişkisinden bahsedeceğim. Inversion of Control’de, bir programın akışının programcıdan alınıp başka aktörlere devredilmesi amaçlanır. Spring Framework bu aktörlerden birisidir. Böylece loose-coupling (gevşek bağlama) sağlanarak kodun esnekliği ve modülerliği artar.
loose-coupling: Bir nesne yaratılırken yaratılan bu nesnenin sınıflara veya başka bileşenlere olan bağımlılığının en aza indirgenmesidir.
Inversion of Control farklı yöntemlerle uygulanabilen genel bir konsepttir. Dependency Injection IoC konseptinin sadece somut bir örneğidir.
Bağımlılık Enjeksiyonu’nda temel yaklaşım, kod içinde yer alan bağımlı bileşenleri tespit ederek bağımsız hale getirmek ve bağımlılıkları dışarıdan enjekte etmektir. Spring’de bu görevleri IoC container’lar üstlenir. Framework’ün çekirdeğinde (özünde) bulunan Spring container’lar nesnelerin oluşturulması, birbirlerine bağlanması, yapılandırılması ve oluşumundan yıkımına kadar ki yaşam döngülerinin yönetilmesi gibi görevlerde yer alır. Bahsi geçen bu nesnelere Spring Bean’ler denir. Bu nesneler herhangi bir POJO sınıf olabileceği gibi JavaBean sınıfı veya EJB gibi heavyweight Java nesneleri de olabilir. Spring bu tür sınıfları destekler. POJO sınıfları JavaBean’lere göre daha esnek sınıflardır.
Bu iki sınıf arasındaki farkı daha iyi kavramak için aşağıdaki siteyi ziyaret edebilirsiniz:
POJO vs Java Beans - GeeksforGeeks
POJO stands for Plain Old Java Object. It is an ordinary Java object, not bound by any special restriction other than…
www.geeksforgeeks.org
Container’lar hangi nesnelerin başlatılacağını, yapılandırılacağını ve birleştirileceğini yapılandırma meta verilerini (metadata) okuyarak elde eder. Meta veriler
XML,
Java annotations veya
Java koduyla temsil edilebilir. Günümüzde geliştiriciler ağırlıklı olarak Java tabanlı kodlamayla çalışmayı tercih ediyor ancak biz burada işin temelini ve mantığını öğrenmeye çalışıyoruz. Bir önceki bölümde XML tabanlı yapılandırmaya bir bakış batmıştık, ilerleyen bölümlerde diğer yöntemlerle birlikte daha detaylı işlenecektir.
Spring IoC container tamamen yapılandırılmış sistem veya uygulamalar üretmek için POJO (Plain Old Java Object) sınıfları ve yapılandırma meta verilerini kullanır. Aşağıdaki diyagram, Spring container’ın iş akışını temsil etmektedir:
İki tür IoC container vardır:
BeanFactory Container
ApplicationContext Container
BeanFactory Container
BeanFactory, Spring IoC container’ın kök (root) interface’idir. org.springframework.beans.factory paketi altında tanımlıdır. Container’a erişmek için kullanılan BeanFactory interface ve alt-interface’ler Spring Framework’ün dependency injection işlevselliğini kullanır. BeanFactory ve BeanFactoryAware, InitializingBean, DisposableBean gibi ilgili diğer interface’ler Spring’le entegre olan pek çok third-party framework ile geriye dönük uyumluluk amacıyla Spring Framework’de halen mevcuttur.
BeanFactory interface’inin temel işlevi lazy loading yapısıyla singleton (
beans scopes bölümünde ne olduğundan bahsedeceğim) bean’ler oluşturmak, yapılandırmak ve DI ile loose coupling sağlamaktır. En çok kullanılan BeanFactory uygulaması (implementation) XmlBeanFactory (deprecated) sınıfıdır.
lazy loading: Bean’lerin
getBean() metodu ile tetiklendikten sonra container tarafından başlatıldığı bir yükleme mekanizmasıdır.
ApplicationContext’e göre ilkel bir yapıda olan BeanFactory bellek tüketimin kritik olduğu mobil cihazlarda veya applet tabanlı uygulamalarda tercih edilebilir. Spring Framework geliştiricilerinin şu meşhur sözünü de buraya bırakıp daha çok tercih edilen container’a geçeyim:
“Eğer gerçekten kullanmak için iyi bir sebebiniz yoksa ApplicationContext kullanın.”
ApplicationContext Container
ApplicationContext, BeanFactory inteface’ini miras alan bu nedenle için de mirasçısının tüm işlevselliğini barındıran gelişmiş bir container’dır. Bu container org.springframework.context.ApplicationContext tarafından tanımlı bir interface’dir. Eager/Aggressive loading yapısıyla bean tanımlarının yüklenmesi, bean’lerin birbirine bağlanması ve istek üzerine dağıtılması gibi özelliklerin yanı sıra daha kurumsal olan:
- Transaction Yönetimi,
- AOP (Aspect Oriented Programming) Hizmetleri,
- Properties dosyasından mesaj işleme (internationalization ve localization - i18n),
- Uygulama event’lerini ilgilenen listener’lara iletme gibi işlevleri gerçekleştirir.
(Spring’de Event Handling)
eager/aggressive loading: Bean’lerin Spring container’ın başladığı anda örneklendiği bir yükleme mekanizmasıdır.
En çok kullanılan ApplicationContext implementation’ları:
FileSystemXmlApplicationContext: Bu container bean tanımlarını XML dosyasından yükler. Constructor’a XML yapılandırma dosyasının tam yolu (full-path) verilmelidir.
ClassPathXmlApplicationContext: Bu container bean tanımlarını XML dosyasından yükler. XML dosyasının projenin classpath’inde olması yeterlidir. Daha sonrasından yapılması gereken tek şey dosya adını constructor’a geçmektir.
XmlWebApplicationContext: Bu container bean tanımlarını barındıran XML dosyasını bir web uygulaması içinden yükler. Bu konu web tabanlı Spring uygulamaları bölümünde işlenecektir.
Bir önceki bölümde aslında ClassPathXmlApplicationContext örneğini yapmış bulunuyoruz. Aşağıdaki bağlantıdan ulaşabilirsiniz:
Ortam Kurulumu Ve Hello Spring Örneği
Spring Framework ile geliştirme yapabilmek için sistemimiz üzerinde öncelikle ortam kurulumunu gerçekleştirmemiz…
barisdalyane.medium.com
Bu bölümde FileSystemXmlApplicationContext örneğini gerçekleştireceğim. Spring kütüphanesinin projeye eklenmesi ile ilgili gerekli bilgilendirme yukarıdaki bölümde yapıldı. Yapacağımız örnek Hello Spring örneğine benzer olacağı için burada sadece main sınıfına yer verdim.
MainApp.java sınıfı aşağıda yer almaktadır.
"file:" Linux’ta belirli bir dosya yolunu belirtmek için kullanılan bir önektir.
Windows’ta örnekteki gibi tam yol vermek yeterlidir:
C:/SpringProjects/ApplicationContext-FileSystem/src/Beans.xml
İşlemleri tamamladıktan sonra IDE üzerinde Run butonuna tıklayarak veya Ctrl + F11 tuş kombinasyonu ile Spring uygulamasını başlatabiliriz.
Output:
Your Message : Hello Spring!
Bölümün sonuna geldik, eğer yazıyı beğendiyseniz 👏 butonuyla destek olabilirsiniz. Görüş ve önerileriniz benim için önemli sonraki yazıda görüşmek üzere.
Yararlandığım Kaynaklar:
Spring - IoC Containers
The Spring container is at the core of the Spring Framework. The container will create the objects, wire them together…
www.tutorialspoint.com
What is IOC Container in Spring? Difference between BeanFactory and ApplicationContext
The Spring IOC Container is a core of the Spring Framework, It will create the objects, wire them together, configure…
adnjavainterview.blogspot.com
Difference Between BeanFactory and ApplicationContext in Spring - DZone Java
I see a lot of questions asking about the difference between BeanFactory and ApplicationContext.Along with that, I get…
dzone.com