Как внедрить 2 экземпляра одного и того же класса в другие 2 разных класса с помощью Spring Framework?

Мой вопрос следующий: предположим, что у вас есть класс Person, в котором есть 2 экземпляра Adam и Jacobs. Итак, у вас есть еще 2 класса: Школа и Университет. Моя задача - с помощью инъекции определить, что Джейкобс учится в школе, а Адам тоже учится в университете.

Как это сделать с помощью Spring Framework? Ответ в письменном виде приветствуется :))

Вы можете показать нам, что уже пробовали?

Bas de Groot 01.11.2018 14:40

Как насчет того, чтобы показать, что вы уже сделали? Это не домашнее задание.

SeverityOne 01.11.2018 14:41

@BasdeGroot Мне очень жаль, но у меня нет исходного кода. Причина в том, что я столкнулся с таким вопросом на одном из собеседований при приеме на работу и до сих пор не могу найти правильного ответа.

matthew 01.11.2018 14:48

Но что не должно помешать вам попробовать сделать исходный код для дела?

pirho 01.11.2018 16:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
442
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что вы пытаетесь внедрить разные экземпляры одного и того же типа в разные компоненты. Вы можете сделать это с помощью spring @Qualifiers. Я намечаю решение проблемы, которой вы поделились.

Имея класс Person.

public class Person
{
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

И конфигурация для каждого человека.

@Configuration
public class DemoConfig {

    @Bean
    public Person adam() {
        return new Person("Adam");
    }

    @Bean
    public Person jacobs() {
        return new Person("Jacobs");
    }
}

Школьный класс.

@Component
public class School {

    private Person jacobs;

    public School(@Qualifier("jacobs") Person jacobs) {
        this.jacobs = jacobs;
    }

    public String personName() {
        return jacobs.getName();
    }
}

Университетский класс похож на школьный, но имя квалификатора изменено на «адам».

Вот тест на ваши требования.

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private School school;

    @Autowired
    private University university;

    @Test
    public void testPersonDependencies() {
        assertThat(school.personName()).isEqualTo("Jacobs");
        assertThat(university.personName()).isEqualTo("Adam");
    }
}

Я думаю, что техника, которую вы применили, довольно понятна. Вы не аннотировали класс Person с помощью @Component, потому что его имя экземпляра по умолчанию будет "person" в контейнере, поэтому вы не применяете аннотацию @Qualifier. Чтобы избежать этого, вы создали два bean-компонента вручную в конфигурации и, таким образом, вы можете гарантировать, что два экземпляра одного и того же класса будут иметь 2 разных имени, заданных в конфигурации. Я правильно понял?

matthew 02.11.2018 07:22

Вы правы, мне больше нравится это решение в этом примере, чтобы избежать аннотации @Qualifier

Jose Antonio Sanchez Imbert 29.11.2019 17:48

Другие вопросы по теме