Spring Boot
Yol Haritası#
- Spring Boot ve AutoConfiguration nedir nasıl çalışır ?
- Spring
main()
methodu çalıştırıldığında Spring otomatik olarak nasıl tomcat sunucusu ayağa kaldırır ? - Spring
properties
dosyası nedir ne işe yarar ?
@Conditional Anotasyonu#
- Bu anotasyonunun konumuzla hiç ilgisi yok gibi görünebilir ama Spring Boot bu anotasyonu sonuna kadar sağlıyor işte bu yüzden de yukarda saydığımız özellikleri bize sunabiliyor.
- Diyelim ki bir yazılım şirketiniz var ve bu şirkette birkaç tane projeyi aynı andan geliştirmektesiniz.
- TÜm projeleri good old spring core ile geliştiryorsunuz. Düz Spring Framework yani.
- Ardından bir yazılımcınız gelip dedi ki : Bir konfigürasyon classınız / projeniz var ve bunu tüm projeler kullanmakta. Bu classsı / projeyi shared bir proje olarak dışarı alalım. Ardın da diğer projelerimize bunun jar’ınız koyalım. Herkes rahat rahat kullansın.
@Configuration
public class MyCompanySharedContextConfiguration {
@Bean
public MyCompanyDataSource dataSource() {
return new MyCompanyDataSource();
}
@Bean
...........
...........
...........
}
- Diyelim ki bu shared proje bir DB operasyonu içeriyor. Haliyle bu projeyi implement eden diğer projeler de DB operasyonu ile ilgili işler yaptı ya da yapacak.
- Peki ya yepyeni bir proje daha geldi ve bu projenin DB operasyonu yapmasına gerek yok ama shared projedeki diğer implemenyasyonları kullanması gerekiyor.
- İşte bu noktada @Conditional anotasyonu devreye giriyor.
Bu anotasyon sayesinde siz Spring’e runtime zamanında hangi @Bean’lerin context’e girip girmeyeceğine karar verebiliyorsunuz.
Gelin aşağıdaki örnekle bu olayı pekiştirelim.
@Configuration
public class MyCompanySharedContextConfiguration {
@Bean
@Conditional(IsRelationalDatabaseCondition.class)
public MyCompanyDataSource dataSource() {
return new MyCompanyDataSource();
}
@Bean
...........
...........
...........
}
- IsRelationalDatabaseCondition ->
package com.atacankullabci;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class IsRelationalDatabaseCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // (1)
return oracleJdbcDriverOnClassPath() && databaseUrlSet(context); // (2)
}
private boolean databaseUrlSet(ConditionContext context) { // (3)
return context.getEnvironment().containsProperty("spring.datasource.url");
}
private boolean oracleJdbcDriverOnClassPath() { // (4)
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}
-
Condition class’ı bir interface ve implement edilmesini istediği “matches” adında bir true / false dönen bir methodu var.
Yani bu bean için kullanılacak koşul sağlandı mı sağlanmadı mı ? Spring bu Bean'i context'e koysun mu koymasın mı ?
-
Burada iki adet durum kontrol edilmekte. Birincisi java’nın classpath’inde Oracle driver’ı varmı ? İkinicisi
.properties
dosyasında herhangi bir dbye ait bir connection url mevcut mu?. -
Spring’in context i içine koyulmuş bir datasource ul var mı yok mu kontrolü.
-
Eğer mevcut java classpath’inde
Class.forName("")
methoduna sağlanan class var ise bu uygulama bu dependency’lere sahip demektir.
Peki bunların Spring Boot ile ne alakası var ?#
Spring Boot aslında @Conditional annotasyonu ile dolu bir shared proje.
Örneğin, properties
dosyasına bir connection url koyduğunuz taktir de Spring Boot içinde DataSource için uygun olan bir @Condiional methodu aktive oluyor ve Spring sizin için bir DataSource oluşturuyor. Ya da uygulamanızı çalıştırınca gömülü bir Tomcat Sunucusu ayağa kalkıyor çünkü Tomcat kütüphaneleri sizin classpath’inizde mevcut?