powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring: Использование @Qualifier чтобы определить какой бин использовать
6 сообщений из 6, страница 1 из 1
Spring: Использование @Qualifier чтобы определить какой бин использовать
    #39677383
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Начал изучать Spring 5.0. Хочу разобраться, как использовать аннотацию @Qualifier для выбора нужного бина.
В ниже приведенном примере я использую @Qualifier("rectangle") и внедряю бин через конструктор без аннотации @Autowired, как это рекомендует Spring, но получаю ошибку:
Parameter 0 of constructor in com.example.springfigure.MainController required a single bean, but 2 were found:
- circle: defined by method 'circle' in class path resource [com/example/springfigure/AppConfig.class]
- rectangle: defined by method 'rectangle' in class path resource [com/example/springfigure/AppConfig.class]

Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed


Figure.java
Код: java
1.
2.
3.
4.
5.
package com.example.springfigure;

public abstract class Figure {
    public abstract String printType();
}


Circle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package com.example.springfigure;

public class Circle extends Figure {
    @Override
    public String printType() {
        return "I am a circle!";
    }
}


Rectangle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package com.example.springfigure;

public class Rectangle extends Figure {
    @Override
    public String printType() {
       return "I am a rectangle!";
    }
}


AppConfig.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
package com.example.springfigure;

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

@Configuration
public class AppConfig {
    @Bean
    public Figure circle() {
        return new Circle();
    }

    @Bean
    public Figure rectangle() {
        return new Rectangle();
    }
}


MainController.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
package com.example.springfigure;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {
    @Qualifier("rectangle")
    private Figure figure;

    public MainController(Figure figure) {
        this.figure = figure;
    }

    @GetMapping("/")
    public String showFigure(Model model) {
        model.addAttribute("msg", figure.printType());
        return "figure";
    }
}
...
Рейтинг: 0 / 0
Spring: Использование @Qualifier чтобы определить какой бин использовать
    #39677388
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если внедрять через поле с аннотацией @Autowired, то работает без ошибок:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Controller
public class MainController {
    @Autowired
    @Qualifier("rectangle")
    private Figure figure;

    @GetMapping("/")
    public String showFigure(Model model) {
        model.addAttribute("msg", figure.printType());
        return "figure";
    }
}
...
Рейтинг: 0 / 0
Spring: Использование @Qualifier чтобы определить какой бин использовать
    #39677392
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но почему не получается через конструктор, как это рекомендует сам Spring?
...
Рейтинг: 0 / 0
Spring: Использование @Qualifier чтобы определить какой бин использовать
    #39677403
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar
Код: java
1.
2.
3.
    public MainController(@Qualifier("rectangle") Figure figure) {
        this.figure = figure;
    }
...
Рейтинг: 0 / 0
Spring: Использование @Qualifier чтобы определить какой бин использовать
    #39677405
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов, спасибо! Работает!

А как можно сделать, чтобы название типа объекта бралось из файла application.properties?
Что то типа:
Код: java
1.
2.
3.
public MainController(@Qualifier(@Value("${type}")) Figure figure) {
        this.figure = figure;
}
...
Рейтинг: 0 / 0
Spring: Использование @Qualifier чтобы определить какой бин использовать
    #39677410
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

или через @Resource

или передавать в конструктор строку через @Value и из контекста получать бин с переданным именем
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring: Использование @Qualifier чтобы определить какой бин использовать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]