Использование конструкторов в Java Spring

Совсем недавно начал изучать Spring и возник вопрос. У меня есть конфигурационный класс SpringConfig, который содержит в себе несколько бинов. Также, у меня есть класс DetectiveBook, который содержит в себе конструктор для объектов. Так вот, проблема в том, что если я хочу определить новый объект, мне нужно писать @Value для каждой переменной в конструкторе(так как, компилятор ругается и выводит "could not autowire no beans of type found") и дополнительно указывать значения в бинах. А можно ли сделать так, чтобы можно было указывать значения, например, только в бине? Код SpringConfig:

package ru;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("ru")

public class SpingConfig {
    @Bean(name = "detective")
    public DetectiveBook detectiveBook(){
        DetectiveBook detectiveBook = new DetectiveBook("TheFirstHuman", 326);
        detectiveBook.setNameOfAuthor("Piter Beilish");
        return detectiveBook;
    }
/*    @Bean
    public DetectiveBook dropnewdetectivBook(){
        DetectiveBook detectiveBook = new DetectiveBook(name, count);
        detectiveBook.setNameOfAuthor(nameofauthor);
        return detectiveBook;
    }*/
    @Bean(name = "library")
    public Library Library(){
        return new Library(detectiveBook());
    }

    @Bean(name = "fabric")
    public TheHistoryBook createTheHistoryBook(){
        return TheHistoryBook.getTheHistoryBook();
    }

}

Код DetectiveBook:

package ru;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Component("detectiveBook")
public class DetectiveBook implements Book {
    private String name;
    private String nameOfAuthor;
    private int countOfPages;

    DetectiveBook(@Value("TheFirstHuman") String  name, @Value("356") int countOfPages){
        this.name = name;
        this.countOfPages = countOfPages;
    }
    @Autowired
    public void setNameOfAuthor(@Value("Piter Beilish") String nameOfAuthor){
        this.nameOfAuthor = nameOfAuthor;
    }

    @Override
    public String dropTheBook() {
        return "Название книги: " + name + ", автор книги: " + nameOfAuthor
                + ", кол-во страниц: " + countOfPages;
    }
    @Override
    public String IwantThisBook(){
        return "Название книги: " + name + ", автор книги: " + nameOfAuthor;
    }
}

Да, конечно я могу это всё указать в xml файле и так гораздо легче, но нужно именно с помощью аннотаций.


Ответы (2 шт):

Автор решения: Roman Konoval

Из-за того, что у вас для класса DetectiveBook задана аннотация @Component спринг, автоматически создает бин в контексте (в дополнение к тем бинам, что вы вручную задали в SpringConfig).

При этом spring-у нужно создать экземпляр используя конструктор, а значит нужны параметры для аргументов. Он их не может найти в контексте и вы вынуждены использовать аннотации со значениями.

Если уберете @Component, то это исправит эту ситуацию.

→ Ссылка
Автор решения: Gringo

Spring сам создаёт обьект .вы описываете его при помощи класса.

→ Ссылка