Bahar: Uygulanan sınıf yerine arayüzü neden otomatik olarak bağlarız?


142

Misal

interface IA
{
  public void someFunction();
}

@Resource(name="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

@Resource(name="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{

  @Autowire
  @Qualifier("b") 
  IA worker;

  worker.someFunction();
}

Birisi bunu bana açıklayabilir mi?

  • Bahar hangi polimorfik tipi kullanacağını nasıl bilir.
  • İhtiyacım var @Qualifier@Resource?
  • Neden uygulanan sınıfı değil arayüzü otomatik olarak bağlarız?

10
Arabirimi otomatik olarak bağlarsınız, böylece farklı bir uygulamada kablo oluşturabilirsiniz - bu, sınıfı değil, arabirimi kodlamanın noktalarından biridir.
Dave Newton

Farklı bir uygulamaya geçirdiniz; Soruyu anlamıyorum.
Dave Newton

Arayüzde kablo bağlantısı yapıyorsak, Impl sınıfında erişmem gereken varsayılan bir görünürlük yöntemi olduğunda ne olur? Genel Arayüz varsayılan değiştirici içeremediğinden, bu yöntem saplamasını arabirime ekleyemiyorum.
jlewkovich


1
Bence sadece bir uygulama için bir arayüz yapmak java dünyasında kabul edilen aptalca bir uygulamadır. Sonuç çok fazla çöp kodudur, ancak herkes SOLID ve OOP kurallarına uydukları için mutludur. Guice kullanın ve bahar tarihin çöp kutusuna atmak.
avgolubev

Yanıtlar:


224

Bahar hangi polimorfik tipi kullanacağını nasıl bilir.

Arabirimin yalnızca tek bir uygulaması olduğu @Componentve Spring'in bileşen taraması etkinken uygulamaya açıklandığı sürece , Spring framework (arabirim, uygulama) çiftini bulabilir. Bileşen taraması etkin değilse, çekirdeği açıkça application-config.xml dosyasında (veya eşdeğer yay yapılandırma dosyasında) tanımlamanız gerekir.

@Qualifier veya @Resource'a ihtiyacım var mı?

Birden fazla uygulamanız olduğunda, her birini nitelemeniz gerekir ve otomatik kablolama sırasında, @Qualifierek açıklama ile birlikte doğru uygulamayı enjekte etmek için ek açıklamayı kullanmanız gerekir @Autowired. @Resource (J2EE anlambilimi) kullanıyorsanız, namebu ek açıklamanın niteliğini kullanarak fasulye adını belirtmelisiniz .

Neden uygulanan sınıfı değil arayüzü otomatik olarak bağlarız?

İlk olarak, genel olarak arayüzleri kodlamak her zaman iyi bir uygulamadır. İkincisi, bahar durumunda, çalışma zamanında herhangi bir uygulamayı enjekte edebilirsiniz. Tipik bir kullanım durumu, test aşamasında sahte uygulama enjekte etmektir.

interface IA
{
  public void someFunction();
}


class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

Fasulye yapılandırmanız şöyle görünmelidir:

<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />

Alternatif olarak, bunların bulunduğu pakette bileşen taramasını etkinleştirdiyseniz, her sınıfı @Componentaşağıdaki şekilde nitelemeniz gerekir :

interface IA
{
  public void someFunction();
}

@Component(value="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


@Component(value="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

@Component    
class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

Daha sonra workeriçinde MyRunnertürün bir örneği enjekte edilecektir B.


@stackoverflow Soruyu düzenlemek hiç mantıklı değil, yeni kod cevaba ait. Aksi takdirde soru bir anlam ifade etmez, çünkü kendi kendine cevap verirdi.
Dave Newton

Vikdor - lütfen düzenlemeye bakın. Sınıflara ve enjekte edilen nesneye açıklama eklemenin doğru yolu bu mu?
stackoverflow

1
@VictorDombrovsky @Autowired @Qualifier("a1") a;Geçerli mi?
Şanslı

1
@ Şanslı bir hata yaptım. Demek istediğim@Autowired @Qualifier("a1") A a;
Victor Dombrovsky

1
Bu arabirim için hangi değişkenlerin program bağımsız değişkenleri veya uygulama özellikleri aracılığıyla enjekte edilmesi gerektiğini denetlemek için uygulamada @Profile bile kullanabilirsiniz.
b15

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.