Sobes.tech
Senior

Spring Framework nasıl çalışır 'kaputun altında'?

sobes.tech yapay zeka

AI'dan gelen yanıt

Spring Framework, birkaç temel ilke ve mekanizmayı kullanarak çalışır:

  1. Kontrolün Tersine Çevirisi (Inversion of Control - IoC):

    • Spring konteyneri (en yaygın olanı - ApplicationContext) nesnelerin (bean'lerin) yaşam döngüsünü yönetir.
    • Nesnelerin bağımlılıklarını kendilerinin oluşturması yerine, bu bağımlılıkları bildirirler ve konteyner bunları enjekte eder (Bağımlılık Enjeksiyonu - DI).
    • Bu, şu yollarla başarılır:
      • Yapılandırma: XML, anotasyonlar (@Autowired, @Inject), JavaConfig (@Configuration, @Bean).
      • Yansıma: Spring, sınıfları, anotasyonları ve meta bilgileri tarar ve bean'leri ile bağımlılıklarını belirler.
  2. Açık Uçlu Programlama (Aspect-Oriented Programming - AOP):

    • Çapraz kesen endişeleri (loglama, güvenlik, işlem yönetimi gibi) modüler hale getirir.
    • Bu endişeler, aspektler şeklinde uygulanabilir ve uygulamanın çeşitli kesişme noktalarına uygulanabilir.
    • Spring AOP, metod çağrılarını yakalamak ve aspektleri uygulamak için proxy'ler (JDK Dynamic Proxies veya CGLIB) kullanır.
    • Bu, çalışma zamanında (runtime weaving) uygulanır.
  3. Soyutlama:

    • Spring, düşük seviyeli API'ler üzerinde yüksek seviyeli soyutlamalar sağlar, böylece geliştirmeyi kolaylaştırır. Örnekler:
      • İşlem yönetimi (PlatformTransactionManager), farklı uygulamaları soyutlar (JTA, JDBC, JPA).
      • Veri erişimi (JDBC, JPA/Hibernate), basitleştirilmiş şablonlar (JdbcTemplate, JpaTemplate) ve istisna işleme sağlar.
      • MVC çerçevesi, HTTP isteklerinin işlenmesini soyutlar.
  4. Spring Konteyneri (ApplicationContext):

    • Ana bileşen olup, bean'leri yönetir.
    • Sınıfları tarar, meta bilgileri okur (yapılandırma), oluşturur, yapılandırır ve bean'lerin yaşam döngüsünü yönetir.
    • Bean tanımlarını kaydeder ve bean örneklerini talep üzerine veya başlatıldığında oluşturur (kapsam ve tembel başlatma durumuna göre).
    • Bağımlılık Enjeksiyonu gerçekleştirir.
    • Yerelleştirme, olay yayınlama, kaynak yükleme gibi hizmetler sağlar.
  5. Yansıma:

    • Geniş çapta kullanılır:
      • Sınıfları, anotasyonlara (@Component, @Service, @Repository, @Controller) göre tarar.
      • Anotasyonların meta bilgilerini okur (@Autowired, @Value, @Transactional).
      • Bean örnekleri oluşturmak ve bağımlılıkları enjekte etmek için yapıcılar ve metodlar elde eder.
      • AOP için dinamik proxy'ler oluşturur.
  6. Bean'in yaşam döngüsü:

    • Spring konteyneri, bean'in yaşam döngüsünü yönetir, bunlar şunları içerir:
      • Örnek oluşturma.
      • Bağımlılık enjeksiyonu.
      • BeanNameAware, BeanFactoryAware, ApplicationContextAware'yi çalıştırma.
      • BeanPostProcessor'ı çalıştırma (postProcessBeforeInitialization metodu).
      • @PostConstruct veya afterPropertiesSet'i çalıştırma.
      • @Bean veya XML'de belirtilen başlatma metodunu çalıştırma.
      • Bean'in kullanımı.
      • BeanPostProcessor'ı çalıştırma (postProcessAfterInitialization metodu).
      • @PreDestroy veya destroyableBean'ı çalıştırma.
      • Yok etme metodunu çalıştırma (@Bean veya XML'de belirtilen).
// Bağımlılık enjeksiyonu için @Autowired anotasyonunun kullanımı örneği
@Component // Spring tarafından yönetilen bean
public class OrderService {

    private final ProductRepository productRepository; // Bağımlılık

    @Autowired // Spring burada bir ProductRepository örneği enjekte edecek
    public OrderService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    // ... servis metodları
}

// AOP için @Aspect anotasyonunun kullanımı örneği
@Aspect // Bu sınıf bir aspekt
@Component
public class LoggingAspect {

    // Nokta kesiti: com.example.service paketindeki herhangi bir sınıfın herhangi bir metodunun yürütülmesi
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceLayer() {}

    // Tavsiye: serviceLayer nokta kesitinde herhangi bir metodun yürütülmesinden önce
    @Before("serviceLayer()")
    public void logMethodCall(JoinPoint joinPoint) {
        System.out.println("Metod çağrısı: " + joinPoint.getSignature().getName());
    }
}

Spring, uygulamanın yapısını ve yürütülmesini yöneten, IoC, DI ve AOP kullanarak modülerlik, test edilebilirlik ve kodun bakımını kolaylaştıran bir çerçeve olarak hareket eder. Ayrıca Java EE ve diğer teknolojilerin birçok karmaşasını soyutlar.