SORU
14 EYLÜL 2011, ÇARŞAMBA


Arasındaki fark <bağlama:annotation-config> vs <bağlama:component-scan>

Bahar 3 öğreniyorum ve <context:annotation-config> <context:component-scan> arkasında işlevlerini kavramak için görünmüyor.

Okuduğum gibiler kolu farklı açıklamalar (@Gerekli, @Autowired vs vs @Component, @Depo, @Hizmeti vb) ama aynı zamanda okuduğum kaydediyorlar aynı bean sonrası işlemci sınıfları.

Beni daha da şaşırtmak için, <context:component-scan> annotation-config bir niteliği vardır.

Birisi bu etiketler üzerinde biraz ışık tutabilir? Benzer, farklı, biri diğerinin yerini, ne birbirlerine, bir ihtiyacınız var mı, hem de tam mı?

CEVAP
17 EYLÜL 2011, CUMARTESİ


<context:annotation-config> ek açıklamalar fasulye zaten uygulama kapsamında kayıtlı (Eğer paket tarayarak XML ile veya tanımlanmış olursa olsun) etkinleştirmek için kullanılır.

<context:component-scan> <context:annotation-config> yok ama <context:component-scan> ayrıca paketler ve uygulama kapsamında fasulye bulmak için kayıt tarama işlemi yapabilir.

Bazı örnekler/benzerliklerini göstermek için kullanacağım.

Sağlar yazın üç fasulye gibi temel ayarlar A, B B C A içine enjekte ediliyor C ile başlayın.

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ırma :

<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>

İçerik yükleme 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 sonuç. Ama bu" Bahar. style "eski Şimdi bu XML kolaylaştırmak için kullanımını sağlıyor açıklamalar var.

İlk olarak, autowire sağlar bbb fasulye ccc özellikler A gibi:

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 benim XML aşağıdaki satırları kaldırmak için izin verir:

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

Benim bu XML için artık daha basit

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

Ben içerik yüklenemedi, aşağıdaki çı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 benim özellikleri autowired değil mi?

Evet, yorumlarda güzel bir özellik ama kendileri hiçbir şey yapmıyorlar. Onlar sadece boş açıklama. İşleme aracı ek açıklamalar bulmak ve onlarla bir şeyler yapmak gerekir.

Kurtarma için <context:annotation-config>. Bu fasulye tanımlanan kendisi olduğu aynı uygulama kapsamında tanımlanan bulduğu notlar için eylemleri etkinleştirir.

Eğer değiştirirsem benim bu XML:

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

ben uygulama kapsamında yük zaman doğru sonuç 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 iki satır kaldırılır ve bir tane ekledim. Bu çok büyük bir fark değil. Ek açıklamalar ile fikir XML kaldırmak gerekiyordu.

O yüzden XML tanımlarını kaldırmak ve bunların yerine ek açıklamalar ile başlayalım:

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 ise biz sadece bu tutun:

<context:annotation-config />

Biz bağlam ve sonuç... hiçbir Şey yük. Hayır fasulye oluşturulur, fasulye autowired. Hiçbir şey!

İlk paragrafta da dediğim gibi <context:annotation-config /> bakla sadece uygulama kapsamında kayıtlı çalışıyor çünkü. Hayır bean oluşturulmuş ve <context:annotation-config /> "" üzerinde çalışmak için. hedefleri yok üç fasulye için XML yapılandırma çıkardım çünkü

Ama bu "hedefler" üzerinde çalışmak için bir paket tarama yapabilen <context:component-scan> için bir sorun olmaz Hadi aşağıdaki giriş XML config içeriğini değiştirmek:

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

Ben içerik yüklenemedi, aşağıdaki çıktıyı alıyorum:

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

Hmmmm... bir şeyler eksik. Neden?

Eğer görünüyorsun closelly sınıfları, sınıf A paket com.yyy ama ben belirtilen <context:component-scan> kullanım paketi com.xxx yani bu tamamen benim cevapsız A sınıf ve tek aldı B ve C olan com.xxx paketi.

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

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

ve şimdi beklenen sonuç elde ederiz

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 işte bu! Şimdi XML tanımları artık yok, açıklama var.

Son bir örnek, açıklamalı sınıfları A, B C tutmak ve XML için aşağıdaki ekleme olarak, içerik yükleniyor sonra ne olacak?

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

Biz yine de doğru sonuç almak:

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

Eğer sınıf A fasulye tarayarak elde değil bile, işleme araçları hala fasulye <context:component-scan> kayıtlı uygulanır el ile XML kayıtlı olan A uygulama bağlamında bile.

Ama eğer aşağıdaki XML olursak <context:annotation-config /> 74 *hem belirtilen ettik çünkü yinelenen fasulye ne olacak?

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

Hayır, hayır taklitten, Biz yine beklenen sonuç

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

Bu iki kategori aynı işleme araçları kaydetmek için (<context:annotation-config /> <context:component-scan> belirtilirse ihmal edilebilir) ama Bahar sadece bir kez onları çalıştıran ilgilenir.

Eğer işleme araçları kendini birden çok kez kayıt varsa bile, Bahar hala büyü sadece bir kez; bu XML yapıyorlar emin olun

<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 üretir:

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, rap.

@Tomasz Nurkiewicz Sean Patrick Floyd anlamak için tüm ihtiyacınız olan yanıtları ile birlikte bu Bilgi umarım <context:annotation-config> <context:component-scan> iş.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Good Creative Academy

    Good Creativ

    19 Kasım 2009
  • GOTO Conferences

    GOTO Confere

    3 EKİM 2011
  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008