Bahar hangi polimorfik tipi kullanacağını nasıl bilir.
Arabirimin yalnızca tek bir uygulaması olduğu @Component
ve 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, @Qualifier
ek açıklama ile birlikte doğru uygulamayı enjekte etmek için ek açıklamayı kullanmanız gerekir @Autowired
. @Resource (J2EE anlambilimi) kullanıyorsanız, name
bu 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ı @Component
aş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 worker
içinde MyRunner
türün bir örneği enjekte edilecektir B
.