Мой вопрос следующий: предположим, что у вас есть класс Person, в котором есть 2 экземпляра Adam и Jacobs. Итак, у вас есть еще 2 класса: Школа и Университет. Моя задача - с помощью инъекции определить, что Джейкобс учится в школе, а Адам тоже учится в университете.
Как это сделать с помощью Spring Framework? Ответ в письменном виде приветствуется :))
Как насчет того, чтобы показать, что вы уже сделали? Это не домашнее задание.
@BasdeGroot Мне очень жаль, но у меня нет исходного кода. Причина в том, что я столкнулся с таким вопросом на одном из собеседований при приеме на работу и до сих пор не могу найти правильного ответа.
Но что не должно помешать вам попробовать сделать исходный код для дела?




Я думаю, что вы пытаетесь внедрить разные экземпляры одного и того же типа в разные компоненты. Вы можете сделать это с помощью 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 разных имени, заданных в конфигурации. Я правильно понял?
Вы правы, мне больше нравится это решение в этом примере, чтобы избежать аннотации @Qualifier
Вы можете показать нам, что уже пробовали?