<Context: annotation-config> ve <context: bileşen taraması> arasındaki fark


691

Ben Bahar 3 öğreniyorum ve ben işlevselliği geride kavramak görünmüyor <context:annotation-config>ve <context:component-scan>.

Okuduğum kadarıyla onlar farklı işlemek gibi ek açıklamalar ( @Required, @Autowiredvs vs @Component, @Repository, @Serviceama aynı zamanda onlar aynı kayıt okudum ne vs) fasulye sonrası işlemci sınıfları.

Beni daha da karıştırmak için, üzerinde bir annotation-config özellik var <context:component-scan>.

Birisi bu etiketlere biraz ışık tutabilir mi? Benzer olan, farklı olan, biri diğerinin yerini alıyor, birbirlerini tamamlıyorlar, ikisine de ihtiyacım var mı?



özetlemek gerekirse: component-scanmümkün olduğunca kullanın .
Jerry Chin

Yanıtlar:


1420

<context:annotation-config> uygulama bağlamında zaten kayıtlı olan fasulyelerde ek açıklamaları etkinleştirmek için kullanılır (XML ile veya paket tarama ile tanımlanmış olmalarına bakılmaksızın).

<context:component-scan>ayrıca uygulama bağlamında fasulye bulmak ve kaydetmek için paketleri <context:annotation-config>yapar, ancak <context:component-scan>tarar.

Farklılıkları / benzerlikleri göstermek için bazı örnekler kullanacağım.

Tip üç fasulye temel kurulum ile başlayalım A, Bve C, ile Bve Cenjekte ediliyor A.

package com.xxx;
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc; 
  }
}

Aşağıdaki XML yapılandırmasıyla:

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A">
  <property name="bbb" ref="bBean" />
  <property name="ccc" ref="cBean" />
</bean>

Bağlamın yüklenmesi aşağıdaki çıktıyı üretir:

creating bean B: com.xxx.B@c2ff5
creating bean C: com.xxx.C@1e8a1f6
creating bean A: com.yyy.A@1e152c5
setting A.bbb with com.xxx.B@c2ff5
setting A.ccc with com.xxx.C@1e8a1f6

Tamam, bu beklenen çıktıdır. Ama bu "eski tarz" Bahar. Şimdi ek açıklamalarımız var, bu yüzden XML'i basitleştirmek için bunları kullanalım.

İlk olarak, fasulye üzerinde bbbve cccözelliklerini otomatik bağlayalım A:

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}

Bu, XML'den aşağıdaki satırları kaldırmama olanak tanır:

<property name="bbb" ref="bBean" />
<property name="ccc" ref="cBean" />

XML'im şimdi basitleştirildi:

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />

Bağlamı yüklediğimde şu çıktıyı alıyorum:

creating bean B: com.xxx.B@5e5a50
creating bean C: com.xxx.C@54a328
creating bean A: com.yyy.A@a3d4cf

Tamam, bu yanlış! Ne oldu? Neden mülklerim otomatik olarak kablolu değil?

Ek açıklamalar güzel bir özelliktir, ancak kendi başlarına hiçbir şey yapmazlar. Sadece bir şeylere not ekliyorlar. Ek açıklamaları bulmak ve onlarla bir şeyler yapmak için bir işleme aracına ihtiyacınız vardır.

<context:annotation-config>kurtarmak için. Bu, kendisinin tanımlandığı aynı uygulama bağlamında tanımlanan fasulye üzerinde bulduğu ek açıklamaların eylemlerini etkinleştirir.

XML'imi bu şekilde değiştirirsem:

<context:annotation-config />
<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />

Uygulama bağlamını yüklediğimde doğru sonucu alıyorum:

creating bean B: com.xxx.B@15663a2
creating bean C: com.xxx.C@cd5f8b
creating bean A: com.yyy.A@157aa53
setting A.bbb with com.xxx.B@15663a2
setting A.ccc with com.xxx.C@cd5f8b

Tamam, bu güzel, ama XML'den iki satır kaldırdım ve bir satır ekledim. Bu çok büyük bir fark değil. Ek açıklamalarla ilgili fikir, XML'i kaldırması gerektiğidir.

Şimdi XML tanımlarını kaldıralım ve hepsini ek açıklamalarla değiştirelim:

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.xxx.B;
import com.xxx.C;
@Component
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}

XML'deyken bunu yalnızca saklıyoruz:

<context:annotation-config />

Bağlamı yüklüyoruz ve sonuç ... Hiçbir şey. Hiçbir fasulye oluşturulmaz, hiçbir fasulye otomatik olarak bağlanmaz. Hiçbir şey değil!

Çünkü ilk paragrafta söylediğim gibi, <context:annotation-config />tek uygulama bağlamında kayıtlı fasulye üzerinde çalışır. Üç fasulye için XML yapılandırmasını kaldırdığım için hiçbir fasulye oluşturulmaz ve <context:annotation-config />üzerinde çalışılacak "hedefler" yoktur.

Ancak bu, <context:component-scan>bir paketi "hedeflerin" üzerinde çalışabilmesi için tarayabilen bir sorun olmayacaktır . XML yapılandırmasının içeriğini aşağıdaki girişle değiştirelim:

<context:component-scan base-package="com.xxx" />

Bağlamı yüklediğimde şu çıktıyı alıyorum:

creating bean B: com.xxx.B@1be0f0a
creating bean C: com.xxx.C@80d1ff

Hmmmm ... bir şey eksik. Neden?

Eğer derslere closelly bakarsak, sınıf Apaketi vardır com.yyyama belirttiğiniz <context:component-scan>paketi kullanmak com.xxxbu tamamen benim cevapsız böylece Asınıf ve sadece aldı Bve Changi Hangi com.xxxpakete.

Bunu düzeltmek için, bu diğer paketi de ekliyorum:

<context:component-scan base-package="com.xxx,com.yyy" />

ve şimdi beklenen sonucu alıyoruz:

creating bean B: com.xxx.B@cd5f8b
creating bean C: com.xxx.C@15ac3c9
creating bean A: com.yyy.A@ec4a87
setting A.bbb with com.xxx.B@cd5f8b
setting A.ccc with com.xxx.C@15ac3c9

Ve bu kadar! Artık XML tanımlarınız yok, ek açıklamalarınız var.

Son bir örnek olarak, açıklamalı sınıfları tutarak A, Bve Cbiz bağlamı yükledikten sonra neler alacak ve XML aşağıdaki ekleyerek?

<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />

Hala doğru sonucu alıyoruz:

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

Sınıf çekirdeği Atarama yoluyla elde edilemese bile , işleme araçları , XML'de manuel olarak kaydedilmiş <context:component-scan>olsa bile uygulama bağlamında kayıtlı tüm çekirdeklere uygulanmaktadır A.

Aşağıdaki XML varsa Ama, ne biz belirttiğiniz çünkü fasulye çoğaltılır hem alacak <context:annotation-config />ve <context:component-scan>?

<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />

Hayır, yineleme yok, yine beklenen sonucu alıyoruz:

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

Çünkü her iki etiket de aynı işleme araçlarını kaydeder ( belirtilirse <context:annotation-config />atlanabilir <context:component-scan>), ancak Spring bunları yalnızca bir kez çalıştırmaya özen gösterir.

İşleme araçlarını birden çok kez kaydettirseniz bile, Spring yine de sihirlerini sadece bir kez yaptıklarından emin olacaktır; bu XML:

<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />
<bean id="bla" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla1" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla2" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla3" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

yine de aşağıdaki sonucu oluşturur:

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@25d2b2
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

Tamam, bu onu hızlandırır.

Umarım bu bilgiler @Tomasz Nurkiewicz ve @Sean Patrick Floyd'un yanıtlarıyla birlikte nasıl <context:annotation-config>ve nasıl <context:component-scan>çalıştığını anlamak için ihtiyacınız olan her şeydir .


8
Alıntı: "<context: bileşen tarama> belirtilmişse" <context: ek açıklama-config /> atlanabilir ". Neden ek açıklama-config kullanıyorsunuz? Neden var?
CodeClimber

2
Mükemmel cevap! Kısa açıklama ile kısa ve net bir örnek gibi bir şey yok. Her şeyi tek bir okumada anladım.
Jigish

19
Keşke bütün Bahar kılavuzunu yazsaydın! Kafa karıştırıcı Spring Framework ile ilgili her şey hakkında en iyi açıklama. Teşekkürler.
eskalera

7
Çok basit ve olağanüstü bir açıklama. Cevabı almanın yanı sıra, bir şeyler anlatmanın iyi yollarını da öğrendim :)
Amir Al

2
Yeni başlayanlar için yazma tarzınız çok kolay. Umarım temel Bahar hakkında bir kitap yazabilirsiniz. Satın alacağım söz veriyorum.
emeraldhieu

167

Hangi ek açıklamaların hangi bildirimler tarafından alındığı bu güzel özeti buldum . Bunu inceleyerek , <context:component-scan/>tarafından tanınan ek açıklamaların üst kümesini tanıdığını göreceksiniz <context:annotation-config/>:

  • @Component, @Service, @Repository, @Controller,@Endpoint
  • @Configuration, @Bean, @Lazy, @Scope, @Order, @Primary, @Profile, @DependsOn, @Import,@ImportResource

Gördüğünüz gibi CLASSPATH bileşen tarama ve Java @Configuration özellikleri ile <context:component-scan/>mantıksal olarak genişliyor <context:annotation-config/> .


16
@Tomasz linki :(
Anand Rockzz

95

Bahar iki şey yapmanıza izin verir:

  1. Fasulye otomatik kablolama
  2. Fasulyelerin otomatik keşfi

1. Otomatik Kablolama
Genellikle applicationContext.xml dosyasında tanımladığınız fasulye ve diğer fasulye yapıcı veya ayarlayıcı yöntemleri kullanılarak kablolanır. Çekirdekleri XML veya ek açıklamalar kullanarak tel yapabilirsiniz. Eğer ek açıklamalar kullanmak durumda, etkinleştirme ek açıklamalar gerekiyor ve eklemek zorunda <context:annotation-config />içinde applicationContext.xml . Bu, etiketin yapısını applicationContext.xml dosyasından basitleştirecektir , çünkü çekirdekleri manuel olarak kablolamak zorunda kalmayacaksınız (yapıcı veya ayarlayıcı). @AutowireEk açıklama kullanabilirsiniz ve fasulye türüne göre kablolanacaktır.

Manuel XML yapılandırmasından kaçmak için bir adım

2. Otomatik
Bulma Otomatik bulma, <bean>etiketi applicationContext.xml dosyasına da eklemenize bile gerek kalmayacağı için XML'i bir adım daha basitleştirir . Belirli fasulyeleri aşağıdaki ek açıklamalardan biriyle işaretlersiniz ve Spring işaretli fasulyeleri ve bağımlılıklarını otomatik olarak Spring konteynerine bağlar. Ek açıklamalar aşağıdaki gibidir: @Controller , @Service , @Component , @Repository . <context:component-scan>Temel paketi kullanarak ve işaret ederek, Spring bileşenleri otomatik olarak keşfedecek ve bileşenleri Spring konteynerine bağlayacaktır.


Sonuç olarak:

  • <context:annotation-config />@Outowired ek açıklamasını kullanabilmek için kullanılır
  • <context:component-scan /> belirli fasulyelerin aranmasını ve otomatik kablolama girişimini belirlemek için kullanılır.

1
Bileşen taraması kullanmak mümkün, ancak ek açıklama yapılandırması bir şekilde mümkün değil mi?
Koray Tugay

Bağlamda annotation-config = "false" kullanın: ek açıklama-config etiketi.
Sara

38

<context:annotation-config> XML'de veya bileşen taramasıyla tanımlanmış olsun, çekirdeklerdeki birçok farklı ek açıklamayı etkinleştirir.

<context:component-scan> XML kullanmadan fasulye tanımlamak içindir

Daha fazla bilgi için okuyun:


Lütfen daha fazla açıklayabilir misiniz? Eğer <context:component-scan>kullanırsam XML kullanarak fasulye tanımını geçersiz kılamaz mıyım?
user938214097

@ user938214097 XML'de veya bileşen tarama ile ek açıklamalarla fasulye tanımlayabilirsiniz
Sean Patrick Floyd

Kullanmak yeterli <context:component-scan>mi? Eğer kullanmazsam bir şey kaybeder miyim <context:annotation-config>?
user938214097

@Tomasz bunu yanıtladı gibi görünüyor
Sean Patrick Floyd

31

İkisi arasındaki fark gerçekten çok basit !.

<context:annotation-config /> 

Yalnızca fasulyelerin özelliklerini ve yapıcılarını kablolama ile sınırlandırılmış ek açıklamaları kullanmanızı sağlar.

Buna karşılık

<context:component-scan base-package="org.package"/> 

Her şeyi sağlar <context:annotation-config />klişeler örn kullanılarak eklenmesiyle, yapabiliriz .. @Component, @Service, @Repository. Böylece sadece fasülye tel ve sadece inşaatçılar veya özellikleri ile sınırlı değil !.


31

<context:annotation-config>: Spring config xml'de kayıtlı fasulye için ek açıklamaların taranması ve etkinleştirilmesi.

<context:component-scan>: Fasulye kaydı +<context:annotation-config>


@Autowired ve @Required olan hedefler mülkiyet seviyesi bu açıklamaları kullanım öncesinde fasulye bahar IOC başvuracaklardır yüzden. Bu ek açıklamaları etkinleştirmek için ilgili fasulyeleri kaydetmeniz veya eklemeniz gerekir <context:annotation-config />. yani <context:annotation-config />sadece kayıtlı fasülyelerle çalışır.

@Required sağlayan RequiredAnnotationBeanPostProcessor işlem aracını
@Autowired sağlayan AutowiredAnnotationBeanPostProcessorişlem aracını

Not: Ek açıklamanın kendisi hiçbir şey yapmaz, altında temel bir sınıf olan ve temel süreçten sorumlu bir İşleme Aracı'na ihtiyacımız var .


@Repository, @Service ve @Controller @Component vardır ve bunlar sınıf seviyesini hedefliyor .

<context:component-scan>paketi tarar ve fasulyeleri bulur ve kaydeder ve yapılan işi içerir <context:annotation-config />.

XML'yi Ek Açıklamalara Taşıma


15

<context:annotation-config>Etiket otomatik @Autowired ek açıklama içeren sınıfların bağımlılık gereksinimlerini çözmek için kod tabanına taramak için bahar söyler.

Spring 2.5 ayrıca @Resource, @PostConstruct ve @ PreDestroy gibi JSR-250 ek açıklamaları için destek ekler Bu ek açıklamaların kullanılması ayrıca belirli BeanPostProcessors öğelerinin Spring kapsayıcısına kaydedilmesini gerektirir. Her zaman olduğu gibi, bunlar bireysel fasulye tanımları olarak kaydedilebilir, ancak <context:annotation-config>bahar konfigürasyonuna etiket eklenerek örtülü olarak da kaydedilebilirler .

Ek Açıklama Tabanlı Konfigürasyonun Bahar dokümanlarından alınmıştır


Spring, 'klişeleştirilmiş' sınıfları otomatik olarak tespit etme ve karşılık gelen BeanDefinitions'ı ApplicationContext'e kaydetme yeteneği sağlar.

Bir javadoc göre org.springframework.stereotype :

Stereotipler, genel mimarideki türlerin veya yöntemlerin rollerini belirten Ek Açıklamalardır (uygulama yerine kavramsal olarak). Örnek: @Controller @Service @Repository vb. Bunlar, araçlar ve yönler tarafından kullanılmak üzere tasarlanmıştır (nokta kesimleri için ideal bir hedef oluşturur).

Bu tür 'stereotip' sınıflarını otomatik olarak algılamak için <context:component-scan>etiket gereklidir.

<context:component-scan>Etiketi de belirtilen enjekte paketi altında fasulye (ve onun tüm alt paket) için kodu taramak için bahar söyler.


14
<context:annotation-config>

Sadece@Autowired ve @Qualiferek açıklamaları çözer, hepsi bu, Bağımlılık Enjeksiyonu ile ilgili , Aynı işi yapan başka ek açıklamalar var, sanırım nasıl @Inject, ama DI'yi ek açıklamalarla çözmek için.

<context:annotation-config>Öğeyi bildirdiğinizde bile , sınıfınıza nasıl bir Bean nasıl olduğunu bildirmelisiniz , üç mevcut seçeneğimiz olduğunu unutmayın.

  • XML: <bean>
  • @Annotations: @Component, @Service, @Repository, @Controller
  • JavaConfig: @Configuration, @Bean

Şimdi birlikte

<context:component-scan>

İki şey yapar:

  • @Component, @Service, @Repository, @Controller ve @Configuration ile açıklamalı tüm sınıfları tarar ve bir Bean oluşturur
  • Aynı işi nasıl <context:annotation-config>yapar.

Bu nedenle, beyan ederseniz <context:component-scan>, artık gerekli değildir <context:annotation-config>.

Bu kadar

Yaygın bir senaryo, örneğin, yalnızca XML yoluyla bir fasulye bildirmek ve DI'yi ek açıklamalar yoluyla çözmekti.

<bean id="serviceBeanA" class="com.something.CarServiceImpl" />
<bean id="serviceBeanB" class="com.something.PersonServiceImpl" />
<bean id="repositoryBeanA" class="com.something.CarRepository" />
<bean id="repositoryBeanB" class="com.something.PersonRepository" />

Biz sadece hakkında hiçbir şey fasulye ilan ettiler <constructor-arg>ve <property>DI @Autowired aracılığıyla kendi sınıflarında yapılandırılır. Hizmetlerin, Depo bileşenleri için @Autowired ve JdbcTemplate, DataSource vb. İçin Depolar @Autowired kullandıkları anlamına gelir.


1
mükemmel açıklama Teşekkürler. @Manuel Jordan
BALS

7
<context:component-scan /> implicitly enables <context:annotation-config/>

ile deneyin <context:component-scan base-package="..." annotation-config="false"/>, yapılandırmanızda @Service, @Repository, @Component cezası çalışır ancak Autowired @ Kaynak @ ve @ Enjekte değil iş.

Bu, AutowiredAnnotationBeanPostProcessor'ın etkinleştirilmeyeceği ve Spring kapsayıcısının Otomatik kablolama ek açıklamalarını işlemeyeceği anlamına gelir .


Bu, <context: component-scan /> 'nin <context: annotation-config />; yani fasulye tanımlarını tarar ve gerekli enjeksiyonları yapar. Annotation-config = "false" ile denedim ve açıkça <context: annotation-config /> kullanarak ayarlama yapmadığım sürece enjeksiyon çalışmadı. Sonunda anlayışım eskisinden daha iyi!
16:55

5
<context:annotation-config/> <!-- is used to activate the annotation for beans -->
<context:component-scan base-package="x.y.MyClass" /> <!-- is for the Spring IOC container to look for the beans in the base package. -->

Dikkat edilmesi gereken diğer önemli nokta, context:component-scanörtülü context:annotation-configolarak fasulye üzerindeki ek açıklamaları etkinleştirmeye çağırmasıdır. Iyi istemiyorsanız context:component-scanörtülü Eğer açıklama-config elemanı ayarlayarak devam edebilir, sizin için ek açıklamaları aktive etmek context:component-scaniçin false.

Özetlemek:

<context:annotation-config/> <!-- activates the annotations --> 
<context:component-scan base-package="x.y.MyClass" /> <!-- activates the annotations + register the beans by looking inside the base-package -->

1

<context:component-scan base-package="package name" />:

Bu konteynere paketimde fasulye sınıflarının bulunduğunu söylemek için kullanılır. Fasulye sınıflarını fasulyenin üstüne konteyner ile taramak için aşağıdaki gibi stereo tip ek açıklamalarından birini yazmamız gerekir.

@Component, @Service, @Repository,@Controller

<context:annotation-config />:

Bean etiketini açıkça XML'de yazmak istemiyorsak, konteynerin çekirdeğinde otomatik bir kablo olup olmadığını nasıl bilir. Bu @Autowiredek açıklama kullanarak mümkündür . konteynere fasulyemde otomatik kablolama olduğunu bildirmek zorundayız context:annotation-config.


0

Bir <context:component-scan/>özel etiket sınıfyolundan fasulye tanımları java paketleri tarayarak ve kaydetme birincil sorumluluğu dışında, tarafından yapıldığı gibi fasulye tanımlarının aynı kümesini kaydeder.

Herhangi bir nedenle varsayılan fasulye tanımlarının bu kaydından kaçınılması gerekiyorsa, bunu yapmanın yolu bileşen taramasında ek bir "ek açıklama-config" niteliği belirtmektir:

<context:component-scan basePackages="" annotation-config="false"/>

Referans: http://www.java-allandsundry.com/2012/12/contextcomponent-scan-contextannotation.html


0

<context:annotation-config>:

Bu, Spring'e, Açıklamalı fasulyeleri bahar fasulyesi olarak kullanacağımı ve @Autowiredbahar konfigürasyonu xml dosyasında beyan etmek yerine ek açıklama ile kablolu olacağını söyler .

<context:component-scan base-package="com.test..."> :

Bu, Spring kabına, açıklamalı fasulyeleri nerede aramaya başlayacağını söyler. Burada bahar temel paketin tüm alt paketlerini arayacaktır.


0

bahar içerik şeması dosyasında daha fazla bilgi bulabilirsiniz. aşağıdaki bahar-bağlam-4.3.xsd

<conxtext:annotation-config />
Activates various annotations to be detected in bean classes: Spring's @Required and
@Autowired, as well as JSR 250's @PostConstruct, @PreDestroy and @Resource (if available),
JAX-WS's @WebServiceRef (if available), EJB 3's @EJB (if available), and JPA's
@PersistenceContext and @PersistenceUnit (if available). Alternatively, you may
choose to activate the individual BeanPostProcessors for those annotations.

Note: This tag does not activate processing of Spring's @Transactional or EJB 3's
@TransactionAttribute annotation. Consider the use of the <tx:annotation-driven>
tag for that purpose.
<context:component-scan>
Scans the classpath for annotated components that will be auto-registered as
Spring beans. By default, the Spring-provided @Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice, and @Configuration stereotypes    will be detected.

Note: This tag implies the effects of the 'annotation-config' tag, activating @Required,
@Autowired, @PostConstruct, @PreDestroy, @Resource, @PersistenceContext and @PersistenceUnit
annotations in the component classes, which is usually desired for autodetected components
(without external configuration). Turn off the 'annotation-config' attribute to deactivate
this default behavior, for example in order to use custom BeanPostProcessor definitions
for handling those annotations.

Note: You may use placeholders in package paths, but only resolved against system
properties (analogous to resource paths). A component scan results in new bean definitions
being registered; Spring's PropertySourcesPlaceholderConfigurer will apply to those bean
definitions just like to regular bean definitions, but it won't apply to the component
scan settings themselves.

0

Tamamlayıcı olarak, açıklama olarak kullanmak @ComponentScaniçin kullanabilirsiniz <context:component-scan>.

Ayrıca spring.io'da açıklanmıştır.

@Configuration sınıflarıyla kullanmak için bileşen tarama yönergelerini yapılandırır. Spring XML öğesiyle paralel destek sağlar.

Dikkat edilmesi gereken bir nokta, Spring Boot kullanıyorsanız, @Configuration ve @ComponentScan @SpringBootApplication ek açıklaması kullanılarak ima edilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.