Spring Framework

0

Cześć. Obecnie uczę się frameworka Spring i wyskoczył mi błąd "Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'castle' available". Czy ktoś korzystający ze Springa jest w stanie mi pomóc i podpowiedzieć co jest nie tak?

package com.kusrSpring.kursSpring;

import domain.Castle;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class KursSpringApplication
{
	public static void main(String[] args)
	{
		ConfigurableApplicationContext ctx = SpringApplication.run(KursSpringApplication.class, args);
		Castle castle = (Castle) ctx.getBean("castle");
		System.out.println(castle);
	}
}
package domain;

public class Knight
{
    private String name;
    private int age;
    private Quest quest;

    public Knight (String name, int age, Quest quest)
    {
        this.name = name;
        this.age = age;
        this.quest = quest;
    }
    public Knight (String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public void setQuest (Quest quest)
    {
    this.quest  = quest;
    }
    @Override
    public String toString ()
    {
        return "Rycerz o imieniu: " + name + " (" + age + "). Zadanie: " + quest + ".";
    }
}
package com.kusrSpring.kursSpring;

import domain.DragonKillingKnight;
import domain.Knight;
import domain.Quest;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Starter implements CommandLineRunner
{
    @Override
    public void run(String... args) throws Exception
    {
        Quest saveThePrincess = new Quest("Uratuj Ksiezniczke");
        Knight Lancelot = new Knight("Lancelot", 29, saveThePrincess );
        System.out.println(Lancelot);

        Quest killTheDragon = new Quest("Zabij smoka");
        Knight percival = new Knight("Percival", 35);
        System.out.println(percival);
        percival.setQuest(killTheDragon);
        System.out.println(percival);
    }
}
package domain;

public class Quest
{
    private String description;

    public Quest (String description)
    {
        this.description = description;
    }

    @Override
    public String toString ()
    {
        return description;
    }
}
package domain;

import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class Castle
{
    private String name = "East Watch";

    public Castle ()
    {

    }

    @PostConstruct
    public void build ()
    {
        System.out.println("Zaraz wybudujemy zamek " + name);
    }

    @PreDestroy
    public void destroy ()

    {
        System.out.println("Zaraz zniszczymy zamek " + name);
    }

    @Override
    public String toString ()
    {
     return "Znajduje sie tutaj zamek o nazwie: " + this.name;
    }
}
0

A skąd Spring ma wiedziec że chcesz ten @Component nazwać castle? :D :D Nadaj mu taką nazwę, to tak sie będzie nazywać. Ale sugerowałbym raczej, jeśli w ogóle, brać beany po TYPIE a nie po nazwie -> ctx.getBean(Castle.class);

Niemnej cały ten kod ma bardzo niewielki sens. Bo przecież SpringBoot sam ci postawi kontekst aplikacji, po co robisz to drugi raz ręcznie? o_O No i nie wiem czego ten przykład ma uczyć, bo to jest książkowy przykład jak i kiedy NIE używać IoC.

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