스프링은 어떤 다형성 유형을 사용해야하는지 어떻게 알 수 있습니까?
인터페이스의 단일 구현 만 있고 해당 구현 @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();
}
그런 다음 worker
in MyRunner
유형의 인스턴스가 주입됩니다 B
.