org.springframework.stereotype anotasyonları nedir?

Emrullah YILDIRIM
3 min readJul 3, 2020

--

Spring, stereotype adı verilen bazı özel anatasyonlara sahiptir. Bu kavram sizin için yeniyse endişelenmeyin, bu makalede sizin için her şeyi açıklayacağız.

Stereotip ne demek?

Belirli bir zümre tarafından ortak olarak benimsenen ve aşırı basitleştirilmiş bir görüş, önyargılı tutum veya eleştirel olmayan yargıyı temsil eden standartlaştırılmış zihinsel önyargı

Gerçek hayatta yüzlerce stereotiplerimiz vardır. Mesela türk filmlerinde araba carpmasi sonucu kör olabilir, bir tokat ile görmeye başlayabilirsiniz veya tüm sarışınlar aptaldır… Gerçek yaşamda tabi ki bunlar oldukça yanlış düşüncelerdir.

Peki yazılımda stereotiplerin amaçı nedir?

Spring kütüphanesinde @Autowired anatasyonu ile dependency injection yapmış oluyorsunuz. Fakat bu anatasyon sadece context’teki beani alıyor, oysa ki hala o beani contexte tanımlamak zorundayız.

Bir sınıf aşağıdaki stereotipler ile ilişkilendirildiğinde Spring kütüphanesi otomatik olarak sınıfı context’e atar. Bunun anlamı ise; Spring kontrolü eline aldığında context’de ki beaniniz ile diğer beanler arasında dependency injection uygulayabilir.

Bu sınıfların tümü org.springframework.stereotype paketi altında bulunabilir.

@Component, Spring tarafından yönetilen beanler için genel bir stereotip anatasyondur. Bu context’e bir sınıf kaydetmek istiyorsanız @Component’i kullanabileceğiniz anlamına gelir. Diğer stereotipler (Controller, Service, Repository) @Component sınıfının alt alanlarıdır. Aslında, kaynak kodlarına bakarsanız, kendilerinin @Component ile ilişkilendirildiğini göreceksiniz. Peki o halde, neden tüm sınıfları @Component ile ilişkilendirmeyelim? Aslında yapabilirisiniz fakat bu biz geliştiriciler için o sınıfın ne iş yaptığını anlamakta zorlanmamıza sebep olacaktır. Kendi ayağımıza sıkmak istemeyiz :)

Küçük bir demo;

public abstract class Animal{

public abstract String run();
}

public class Horse extends Animal{

@Override
public String run() {
return "Rahvan";
}
}

Stereotip kullanmadan konfigürasyon sınıfımızda Animal ve Horse sınıflarının ilişkisini belirtmemiz gerekirdi.

@Configuration
public class ApplicationConfig{

@Bean
public Animal pickTheAnimal() {
return new Horse();
}
}

Fakat stereotip ile ekstra bir konfigürasyon yazmamıza gerek yok.

@Component
public class Horse extends Animal {

@Override
public String run() {
return "Rahvan";
}
}

Sınıflarınızın bu şekilde davranmasını istiyorsanız stereotipler çok yararlıdır. Yapılandırma dosyanızın için bir bean tanımlamanız gerekmez. Spring otomatik olarak bu stereotipten bir bean yaratacaktır.

Component, Repository, Service ve Controller anatasyonlarının stereotip paketine ait olmasının nedeni budur. Spring sınıflarınızı sadece aşırı basitleştiriyor. Dolayısıyla bu yüzden adı Stereotip.

Component ve Bean anatasyonları arasındaki fark;

Aslında bu iki anatasyon oldukça farklı.

@Component anatasyonu, otomatik olarak sınıfı denetler ve konfigüre eder. Burada zorunlu olarak, one-to-one mapping vardir.(sınıf başına bir bean) @Bean ise, Spring’in bizim için otomatik olarak konfigüre etmesi yerine tek bir bean oluşturmak için kullanılır.

Diğer bir büyük fark @Component’in sınıf düzeyinde bir anatasyon olması ve @Bean’ın bir metod seviyesinde anatasyon olmasıdır.

Kısaca;

  • Tüm anatasyonlar yerine @Component kullanabilirsiniz.(Tavsiye edilmez)
  • Component gibi diğer alt stereotipler de ekstra özellikler sunmaktadır.
  • Tüm sınıflar için o sınıfa özel olarak tanımlanmış anatasyonu kullanmanız tavsiye edilir.
  • Stereotip ile ilişkilendirdiğiniz beanler için AOP yazmak çok daha kolay olacaktır.

--

--

Emrullah YILDIRIM

Kendine Blogger. Yazarak öğrenen, yazdıklarini paylaşan Java Software Engineer.