Spring dokáže také vytvořit instanci anotované třídy a přiřadit ji do proměnné datového typu rozhraní. Více v následujícím príkladu. Máme rozhraní MyService a dvě třídy, které toto rozhraní implementují: MyOracleServiceImpl a MyMicrosoftServiceImpl. Podle toho, která třídu bude mít anotaci, ta se použije.
│ pom.xml
│
├───src
│ ├───main
│ │ └───java
│ │ └───cz
│ │ └───vitfo
│ │ └───spring02
│ │ │ Main.java
│ │ │ MyService.java
│ │ │
│ │ └───impl
│ │ MyMicrosoftServiceImpl.java
│ │ MyOracleServiceImpl.java
│ │
│ ├───resources
beans.xml
Soubory pom.xml a beans.xml zůstávají stejné jako v předchozím příkladu.
MyService.java
public interface MyService {
public String getServiceName();
}
MyOracleServiceImpl.java
import org.springframework.stereotype.Service;
import cz.vitfo.spring02.MyService;
@Service
public class MyOracleServiceImpl implements MyService {
public String getServiceName() {
return "ORACLE";
}
}
MyMicrosoftServiceImpl.java
import cz.vitfo.spring02.MyService;
public class MyMicrosoftServiceImpl implements MyService {
public String getServiceName() {
return "MICROSOFT";
}
}
Main.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main
{
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyService ms = context.getBean(MyService.class);
System.out.println(ms.getServiceName());
}
}
Pokud aplikaci spustíme, vypíše se řetězec ORACLE. Sice existují dvě implementace, ale pouze MyOracleServiceImpl má anotaci @Service. Proto se použije a přiřadí do proměnné MyService ms. V případě, že bychom anotovali třídu MyMicrosoftServiceImpl, vypsal by se řetězec MICROSOFT. Pozor, není možné mít anotace na obou třídách. V tom případě by došlo k výjimce.
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [cz.vitfo.spring02.MyService] is defined: expected single matching bean but found 2: myOracleServiceImpl,myMicrosoftServiceImpl