Daha önceki yazımda en temel ve en yaygın olarak kullanılan Spring anotasyonlarından ve onların çalışma mantığından bahsetmiştim. Kısa ve öz bir şekilde anlattığım temel anotasyonlar ve çalışma mantıkları konulu yazıya şuradan ulaşabilirsiniz :
@SpringBootApplication Anotasyonu Nedir?
Bu
anotasyon @Configuration, @EnbaleAutoConfiguration, @ComponentScan anotasyonlarının
üçünü de içeren temel bir anotasyondur. Özet geçmek gerekirse,
- @Configuration : Java tabanlı konfigürasyon işlemi yapan bir anotasyondur
- @ComponentScan : Projeye dahil edilen komponenetlerin otomatik taranmasını sağlar.
- @EnableAutoConfiguration : Varsayılan konfigürasyonların otomatik gerçekleşmesini sağlar.
@Configuration Anotasyonu Ne Yapar?
- @Bean tanımlaması içeren fonksiyonlar içerir.
- Tanımlandığı fonksiyon her neyi return ediyorsa, onun context içine ekleneceğini belirtir.
- @Bean, genelde 3rd parti sınıflar context içine eklenmek istediğinde kullanılır.
- Dosya içerisinden birden çok bean tanımı olabileceğini belirtir.
- Eskiden config işlemleri xml dosyaları içinde yapılırken, Spring 3’ten sonra @Configuration anotasyonuyla java sınıflarından @Bean tanımlamasıyla yapabilme özgürlüğü geldi.
- Runtime anında config olarak tanımlanan sınıf içindeki @Bean anotasyonlarının, spring container tarafından işlenebilmesi için belirtilir.
- Aslında @Configuration olarak tanımlanan sınıf içindeki @Bean tanımlamalarının her biri için app context içinde oluşturulmak üzere otomatik xml tanımlaması yapılmış oluyor.
- Eğer ben tanımı XML dosyasından yapıldıysa, @ImportResource(“another-application-context.xml”) tanımlaması ile harici bir xml import edilebilir
- @Import(OtherConfiguration.class) tanımlamasıyla harici bir config import edilebilir.
@Bean Anotasyonu Nedir?
- Metod düzeyinde kullanılan bir anotayondur.
- Bu anotasyon tıpkı @Component anotasyonu gibi çalışır.
- Bir sınıf @Configuration anotasyonu ile tanımlıysa, o sınıfın fonksiyonları @Bean olarak tanımlanabilir.
- @Bean olarak tanımlanan bir fonksiyon için, fonksiyon adı geçerli bir id yada bean adı olur.
- Eğer bir metod @Bean ile tanımlıysa, Spring tarafından yönetilen bir Bean ürettiğini belirtilmiş olur.
Spring dokumantasyonunda @Configuration ve @Bean için sunulan örnek kullanım :
@Configuration public class AppConfig { @Bean public TransferService transferService() { return new TransferServiceImpl(); } }
@Bean tanımlaması üstteki gibi Java dosyası içerisindeki bir fonksiyon üzerinde direkt olarak tanımlanacağı gibi şu şekide bir XML dosyası içinde de tanımlanabilir :
<beans> <bean name="transferService" class="com.acme.TransferServiceImpl"/> </beans>
Her iki kullanım da aynıdır ve Spring Application Context içinde, "transferService" adında bir bean nesnesi oluşturulmasını sağlar.
@EnableAutoConfiguration Anotasyonu Nedir?
Uygulamaya eklenen Jar dosyalarının otomatik olarak konfigüre edilmesini sağlar. Örneğin, projeniz için herhangi bir veritabanı konfigürasyonu yapmadıysanız ve sadece HSQL veritabanını uygulamanıza import ettiyseniz, bu durumda @EnableAutoConfiguration sizin için otomatik olarak in-memory bir veritabanı oluşturup kullanımınıza sunacaktır.
- @EnableAutoConfiguration, module bazlı class ve classpath’leri config yapar.
- Örneğin, Thymeleaf classpath içinde yer alıyorsa, tema resolver otomatik aktif edilir.
- Örneğin, projeye bir veritabanı import edilmişse, database konfigürasyonlarının otomatik gerçekleşmesi için JdbcTemplate bean'i otomatik oluşturulur.
- @Conditional bazlıdır.
- @EnableAutoConfiguration(exclude=DataSourceAutoConfiguration.class) yaparak istediğimiz config sınıfını devredışı bırakabiliriz.
- @EnableAutoConfiguration Jar bağımlılığı olan sınıfları konfigüre eder.
@Component Anotasyonu Ne İşe Yarar?
- Class seviyesinde bir anotasyondur.
- Component taraması sırasında bu anotasyona ait sınıflar taranır.
- @Repository, @Service, @Configuration and @Controller anotasyonlarının tamamı @Component anotasyonudur.
- Component anotasyonu ile ilgili daha fazla bilgi için buraya tıklayınız.
@ComponentScan Nasıl Çalışır?
- @ComponentScan, proje içerisinde bean olarak tanımlanan sınıfları tarar.
- @Configuration içeren tüm Spring sınıflarını otomatik olarak tarar.
- @Configuration ile kullanılan @Import(OtherConfiguration.class) tanımlamasının alternatifi olarak kullanılabilir.
- @Repository, @Service, @Configuration ve @Controller anotasyonlarının tamamı @Component anotasyonu olduğundan, bu anotasyonları içeren sınıfları da otomatik olarak tarayıp Spring Application Context içine ekler.
@Component ve @Bean Anotasyonları Arasındaki Fark Nedir?
Her iki anotasyonda aynı işi gerçekleştirirler. Tanımlandıkları yer için Application Context içerisinde bean oluşturmayı sağlarlar. Aralarındaki temel fark, kullanım amaçlarıyla ilgilidir.
Örneğin iki farklı uygulamanız var ve bu iki uygulama da Mail modülünü kullanıyor fakat, uygulamardan bir tanesi mail modülüne ait tüm servisleri kullanırken, diğerinde sadece belli başlı servisler kullanılıyor. Böyle bir durumda Mail modülünü projeye @Component olarak import etmek demek, işe yarayan ve yaramayan tüm Mail servislerini projeye gereksiz yere dahil etmek anlamına gelecektir. Bunu önlemek için ise, @Component yönetimini seçtiysek eğer, @ComponentScan için koşullar yazmamız gerekecektir. Fakat bu koşulları dikkatli yazmazsak servisin düzgün çalışmama ihtimali de var.
Diğer taraftan, @Component kullanmak yerine @Bean ifadesi kullanılabilir. @Bean ifadesini sadece kullanacağımız servisler için tanımlarsak, işe yaramayan servisleri için boş yere projemize import etmemiş oluruz. Bu yüzdendir ki @Bean tanımlaması daha çok, third-pary (üçüncü parti) uygulamaları projemize import ederken tercih edilir. Diğer durumlarda @Component kullanılabilir.
Spring ile ilgili temel anotasyonları anlattığım yazımda @Component konusuna daha geniş bir yer vermiştim. Oradan da @Component konusuyla ilgili daha geniş bilgi alabilirsiniz.
Temel anotasyonlarla ilgili daha fazla bilgiye şuradan ulaşabilirsiniz : Spring Anotasyonlarının Çalışma Mantığı ve Temel Anotasyonlar
Yazıyla paralel olarak yararlanabileceğiniz kaynaklar :
- https://www.baeldung.com/spring-bean-annotations
- https://codeboje.de/difference-spring-bean-component/
- https://howtodoinjava.com/spring-core/spring-configuration-annotation/
- https://stackoverflow.com/questions/24014919/understanding-spring-configuration-class
- https://www.java67.com/2018/05/difference-between-springbootapplication-vs-EnableAutoConfiguration-annotations-Spring-Boot.html
- https://stackoverflow.com/questions/35005158/what-is-the-difference-between-componentscan-and-enableautoconfiguration-in-sp
- https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html
- https://codeboje.de/difference-spring-bean-component/
Çok açıklayıcı olmuş teşekkürler
YanıtlaSil