2017-09-14 20 views
6

Spring Boot'un @ConditionalOnBean, @ConditionalOnClass, @ConditionalOnProperty, ConditionalOnWebApplication gibi birçok @Conditional ek açıklamalarının olduğunu anlıyorum. Ama bunun nasıl çalıştığını bilmiyorum. Örnek içinKoşullu ek açıklama, Spring Boot'da nasıl çalışır?

: Ben is anlaşılan ne

@Configuration  
@ConditionalOnClass(MyBean.class) 
public class MyConfiguration{ 
    // omitted  
} 

, MyConfigurationMyBean benim sınıf yolunda mevcut olması durumunda yüklenecektir. Ancak derleyici @ConditionalOnClass(MyBean.class) satırına ulaştığında, derleyici hatası atarsa, MyBean sınıfı sınıf yolumda değilse nasıl derlenir ve çalışır? Eclipse'de bu kodu eklediğimde derleme zamanı hatası alıyorum. Üzgünüm, bu çok basit bir soru olsa da, anlamak için ne kaçırdığımı bilmiyorum.

cevap

6

Bahar Boot opsiyonel bağımlılıkları dolu derlenmiş ediliyor; Spring Boot derlendiğinde, MyBean.class sınıfyolundadır.

Artık uygulamanızın sınıf yolunda bu MyBean.class olmayabilir, ancak çalışma zamanında başarısız olmaz. Bunun nedeni, @ConditionalOnClass ek açıklamalarını işleyen altyapının, yapılandırmanın bayt kodunu gerçekten okuyacağı ve yalnızca bu MyBean.class varsa, bunları yükleyeceğidir. Bakınız @ConditionalOnClass javadoc.

Şimdi otomatik yapılandırma geniş bir konu ve more about this in this talk'u öğrenebilirsiniz. Spring Boot Documentation olarak

+0

Açıklamanız ve bağlantılarınız çok faydalıdır. Çok teşekkür ederim –

0

Genellikle Optional bağımlılıkları kullanırsınız:

<dependency> 
    <groupId>org.freemarker</groupId> 
    <artifactId>freemarker</artifactId> 
    <optional>true</optional> 
</dependency> 
1

söyler:

@ConditionalOnClass ve @ConditionalOnMissingClass açıklamalar yapılandırma varlığı ya da belirli sınıflar yokluğunda göre dahil edilmesini sağlar. Açıklama metadatası ASM kullanılarak ayrıştırılan olması nedeniyle, gerçekte gerçek sınıfına başvurmak için değer özniteliğini kullanabilirsiniz; bu sınıf, aslında çalışan uygulama sınıfyolunda üzerinde görünmeyebilir. Bir String değeri kullanarak sınıf adını belirtmeyi tercih ederseniz, ad özelliğini de kullanabilirsiniz.

Böylece sınıflar üzerinde sınıf artık olmasa bile, çalışma zamanı sırasında sınıf isimleri ayrıştırmak mümkün baytkodu manipülasyon kütüphane ASM kullanın. Bahar açık kaynak olduğundan, sadece annotation reading code'a bakabilirsiniz.

İlgili konular