Wstrzykiwanie odpowiedniej klasy nie działa prawidłowo

0

Podpowiedzcie co pominąłem,że nie wstrzykuje mi do

private TaskInterface task;

odpowiedniej klasy. Poniżej wrzucam kod:

TaskInterface:

 
package pl.konrad.task;

public interface TaskInterface {
//nie ma tu zadnych metod
}

TaskImplement:

 
package pl.konrad.task;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Qualifier("default_task")
public class TaskImplement implements TaskInterface {

	
	private String name;
	private String description;		
	private int priority;
	
	
	
	
	
	public TaskImplement() {
		
	}
	
	
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public int getPriority() {
		return priority;
	}
	public void setPriority(int priority) {
		this.priority = priority;
	}
	
	
	
}

ProjectImplement - klasa do ktorej chce wstrzyknac:

package pl.konrad.project;

import org.springframework.beans.factory.annotation.Autowired;


import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import pl.konrad.employee.EmployeeInterface;
import pl.konrad.leader.LeaderInterface;
import pl.konrad.task.TaskInterface;

@Service
public class ProjectImplement implements ProjectInterface {

	
	private int id;
	
	@Autowired
	@Qualifier("default_task")
	private TaskInterface task;

         @Override
	public TaskInterface create_task() {
		
                //JEZELI UZYWAM TUTAJ ZMIENNEJ task, NIE DOSTAJE JEJ GETEROW I SETEROW;
		
		return this.task;
	}


 
2

Przecież twój TaskInterface nic nie zawiera. A co interfejs obchodzą szczegóły implementacyjne?

1

Problem to masz ze zrozumieniem czym są interfejsy chyba. Masz u siebie obiekt widziany przez interfejs TaskInterface wiec masz TYLKO metody tego interfejsu.
Żeby wyjaśnić dlaczego tak jest, wyobraź sobie że mam klasę

public class TaskImplement2 implements TaskInterface {
}

I postanawiam podmienić komponent TaskImplement na TaskImplement2. I co się stanie jeśli ta klasa nie ma takich metod jakie miała TaskImplement? Bo pewny mogę być tylko metod z TaskInterface.

0

czyli to nie działa w ten sposób,że ustawiam w klasie do ktorej chce wstrzyknać:

 @Autowired
private TaskInterface task;

i mogę przy uzyciu @Qualifier decydować jaka implementacje tego interfejsu wstrzykne i task bedzie miala dostep do swoich zmiennych,geterow i seterow ?

0

Umiesz ty programować w javie? o_O Bo mam wątpliwości. Twój problem nie jest związany w ogóle ze Springiem i ze wstrzykiwaniem tylko z brakiem zrozumienia idei interfejsów...

0

ok rozumiem Was.Wydaje mi sie ,że w moim przypadku lepszym rozwiazniem bedzie zrobienie klasy abstrakcyjnej i wtedy te niby implementacje beda dziedziczyły wszystko i bede mogł podnmieniac wstrzykiwanie przez @Qualifier

0

Nie rozumiesz. To samo możesz osiągnąć uzywając interfejsu...

3

Interfejs to taka klasa abstrakcyjna, tylko, że bez pól i jej metody nie mają ciała, tylko samą sygnaturę (zazwyczaj).

Przykład.

public interface Szczekacz {
    String szczekaj();
}

public class Pies implements Sczekacz {
    public String szczekaj() {
        return "Hau! Hau!";
    }
}

public class Jelen implements Sczekacz {
    public String szczekaj() {
        return "Nie umiem naśladować szczekania jelenia";
    }
}

W interfejsie definiujesz tylko sygnaturę metody, zostawiając jej implementację dla klas, które będą po nim dziedziczyć. Dlatego potem możesz sobie zrobić:

Szczekacz szczekaczKtoryJestPsem = new Pies();
szczekaczKtoryJestPsem.sczekaj();

Sczekacz szczekaczKtoryJestJeleniem = new Jelen();
szczekaczKtoryJestJeleniem.sczekaj();

Takie zachowanie nazywamy polimorfizmem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1