[java] Spring : 왜 우리는 구현 된 클래스가 아닌 인터페이스를 자동 와이어 링합니까?

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();
}

누군가 나에게 이것을 설명 할 수 있습니까?

  • 스프링은 어떤 다형성 유형을 사용해야하는지 어떻게 알 수 있습니까?
  • 내가 필요합니까 @Qualifier@Resource?
  • 왜 우리는 구현 된 클래스가 아닌 인터페이스를 자동 와이어 링합니까?


답변

스프링은 어떤 다형성 유형을 사용해야하는지 어떻게 알 수 있습니까?

인터페이스의 단일 구현 만 있고 해당 구현 @Component에 Spring의 구성 요소 스캔이 활성화되어있는 한 Spring 프레임 워크는 (인터페이스, 구현) 쌍을 찾을 수 있습니다. 컴포넌트 스캔이 사용 가능하지 않으면 application-config.xml (또는 동등한 스프링 구성 파일)에서 Bean을 명시 적으로 정의해야합니다.

@Qualifier 또는 @Resource가 필요합니까?

구현이 두 개 이상인 경우 각 구현을 규정해야하며 자동 배선 중에 @Qualifier주석을 사용하여 주석과 함께 올바른 구현을 주입 해야합니다 @Autowired. @Resource (J2EE 시맨틱)를 사용하는 name경우이 주석 의 속성을 사용하여 Bean 이름을 지정해야합니다 .

왜 우리는 구현 된 클래스가 아닌 인터페이스를 자동 와이어 링합니까?

첫째, 일반적으로 인터페이스에 코드를 작성하는 것이 좋습니다. 둘째, 스프링의 경우 런타임에 모든 구현을 주입 할 수 있습니다. 일반적인 사용 사례는 테스트 단계에서 모의 ​​구현을 주입하는 것입니다.

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();
}

Bean 구성은 다음과 같아야합니다.

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

또는 패키지가있는 패키지에서 구성 요소 스캔을 활성화 한 경우 @Component다음과 같이 각 클래스를 한정해야 합니다.

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();
}

그런 다음 workerin MyRunner유형의 인스턴스가 주입됩니다 B.


답변

또한 Cglib2AopProxy 프록시 방법으로 프록시 와 같은 로그에 일부 경고가 발생할 수 있습니다 . 그리고 이것에 대한 다른 많은 이유가 여기에 설명되어 있습니다. 왜 서비스와 dao 계층에 항상 단일 구현 인터페이스가 있습니까?


답변