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.