IoC (Inversion of Control) Containers

Java Framework

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.

IoC Implementations

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:

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:

Spring Container Workflow

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

IoC Containers Hierarchy

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:

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:

Kodcular

Bu yayın yazılım üzerine üretilen blogların bir araya…

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store