Spring - wstrzykiwanie zależności

0

Witam, przerabiam właśnie książkę "Spring w akcji" i pracując z przykładami z książki nie mogę przeskoczyć jednego błędu który sie pojawia. W książce nic o tym nie jest szerzej wyjaśnione. Szukałem, kombinowałem z zależnościami ale dalej nie chce przejść. Przykład jest prosty:
Klasa BraveKnight która przyjmuje w konstruktorze jakiś quest z interfejsu Quest

package com.springinaction.knights;

public class BraveKnight implements Knight {
private Quest quest;
	public BraveKnight(Quest quest) {
		this.quest=quest;
	}
	public void embarkOnQuest() {
		quest.embark();
	}
}

Interfejs:

package com.springinaction.knights;

public interface Quest {
	void embark(){}

Następnie Klasa questu:

package com.springinaction.knights;

import java.io.PrintStream;
public class SlayDragonQuest implements Quest {
	private PrintStream stream;	
	public SlayDragonQuest(PrintStream stream) {
		this.stream=stream;
	}
	@Override
	public void embark() {
		stream.println("Embarking on quest to slay the dragon");
	}
}

Prosta konfiguracja zależność w pliku knights.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation = "http://www.springframework.org/schema/beans
		http//www/springframework.org.schema/beans/spring-beans-3.0.xsd">
		
	<bean id="knight" class ="com.springinaction.knights.BraveKnight.java">
		<constructor-arg ref="quest" />
	</bean>
	
	<bean id ="quest"
				class ="com.springinaction.knights.SlayDragonQuest">
	<constructor-arg value="#{T(System).out}" /> 
	</bean>
</beans>

I Klasa Main gdzie występuje błąd:

package com.springinaction.knights;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class KnightMain {

	public static void main(String[] args) throws Exception {

		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("knights.xml");
		Knight knight = context.getBean("knight");   <---- Błąd - "Type mismatch: cannot convert from Object to Knight"
		knight.embarkOnQuest();
                context.close()
	}
}	

Niby wszystko powinno działać normalnie jednak w Klasie main w linijce gdzie musimy uzyskać komponent knight cały czas wyskakuje błąd "Type mismatch: cannot convert from Object to Knight" - rozumiem co to znaczy ale dlaczego ta zależność nie działa? Z góry dziękuje za pomoc lub wskazówki gdzie może dodać jakąś zależność lub czy coś mam źle skonfigurowane.

0
  1. Trzeba tam dorzucić rzutowanie (Knight)context.getBean...
  2. Trzeba wyrzucić książkę. Masz jakieś wydanie z czasów Springa łupanego. W tej wersji co masz opisany to Spring jest nawet bardziej bezużuteczny niż normalnie.
0

Dzięki za odwiedź, jeśli użyje rzutowania nie jestem w stanie użyć metody knight.embarkOnQuest();

1

I bardzo dobrze, że nie możesz. Nie powinieneś.
Naucz się javy, a potem dopiero Springa, jesli z jakiegoś powodu potrzebujesz.

Ten kod nie powinien się kompilować - bo ten BraveKnight nie jest żadnym Knight. Nie implementuje interfejsu.
(jak to rycerz: ściemnia tylko po dwóch piwach).

0
jarekr000000 napisał(a):

I bardzo dobrze, że nie możesz. Nie powinieneś.
Naucz się javy, a potem dopiero Springa, jesli z jakiegoś powodu potrzebujesz.

Gdybym oczekiwał tak merytorycznej odpowiedzi, zapytał bym na Onecie. Niepotrzebne zdanie ale dzięki za objaśnienie.

0
Kwaśny91 napisał(a):
jarekr000000 napisał(a):

I bardzo dobrze, że nie możesz. Nie powinieneś.
Naucz się javy, a potem dopiero Springa, jesli z jakiegoś powodu potrzebujesz.

Gdybym oczekiwał tak merytorycznej odpowiedzi, zapytał bym na Onecie. Niepotrzebne zdanie ale dzięki za objaśnienie.

Co jest w tej odpowiedzi nie tak? Sama prawda. Zwłaszcza, że Ty nawet podstaw nie masz jak sam widzisz.

0
Pętliczek napisał(a):

Co jest w tej odpowiedzi nie tak? Sama prawda. Zwłaszcza, że Ty nawet podstaw nie masz jak sam widzisz.

Wnosisz po jednym przedstawionym problemie? Ok.
Faktem jest że sie uczę i nie zawsze wychwyce to co wychwycicie Wy bardziej doświadczeni. Jest to przykład z książki przeanalizowany tak jak jest zapisany w książce dlatego może nie pomyślałem dalej bo: "-Jak to? W książce wszystko działa". Dzięki za słowa krytyki, są motywujące by działać dalej a co do aluzji himalajskich, Panowie Mount Everest wcale nie jest najtrudniejszą górą do zdobycia.

1
  1. Ksiażka jest starsza od ciebie, bo to Spring 3 a mamy Springa 5.
  2. Przykład jest faktycznie tragiczny, bo niby pokazuje jak użyć DI/IoC z technicznego punktu widzenia, ale już nie z logicznego.
  3. Twój interfejs Knight powinien mieć metodę embarkOnQuest którą overridujesz w tym swoim BraveKnight, albo beana którego wyciągasz rzutuj na BraveKnight.
  4. Jeśli nie rozumiesz czemu to "nie działa" to jesteś na etapie "hello world" w javie i jakieś próby ogarniania Springa w tej chwili to pomysł zupełnie bez sensu.
0

Miałem tę książkę w łapkach. To jeden z pierwszych przykładów, gdzie pokazane są sposoby obchodzenia się ze Springiem. Autor często pokazuje rozwiązanie omawianego problemu zarówno z wykorzystaniem konfiguracji w xml jak i w javie. Nie jest to aż tak bezwartościowa pozycja - imo

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