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