Spring jednoduše 4. díl

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

Napsat komentář