Как Spring Boot знает, какой объект внедрить? - PullRequest
3 голосов
/ 05 августа 2020

Допустим, у меня есть следующие классы

@Data
@Component
public class Student {
    
    @Autowired
    private Vehicle vehicle;

}


public interface Vehicle{}

@Component
public Jeep implements Vehicle{}

@Component
public Van implements Vehicle{}

Как Spring Boot узнает, какой тип Транспортного средства следует поместить в мой объект Student?

Я знаю, что Guice имеет модули, которые точно определяют, как определенный объект создается с помощью @Provides и @Singleton в сочетании с @Inject в классах, которым требуется этот объект.

Есть ли у Spring Boot то же самое?

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Для доступа к bean-компонентам с тем же типом мы обычно используем аннотацию @Qualifier («beanName»).

@Data
@Component
public class Student {
    @Autowired
    @Qualifier("Jeep")
    private Vehicle vehicle;
}


public interface Vehicle{}

@Component
@Qualifier("Jeep")
public Jeep implements Vehicle{}

@Component
@Qualifier("Van")
public Van implements Vehicle{}

и вы можете аннотировать свой bean-компонент по умолчанию с помощью @Primary, чтобы, если нет квалификатора, этот bean-компонент будет выбрано

@Data
@Component
public class Student {
    @Autowired
    private Vehicle vehicle;
}


public interface Vehicle{}

@Component
@Primary
public Jeep implements Vehicle{}

@Component
public Van implements Vehicle{}
2 голосов
/ 05 августа 2020

Краткий ответ: Да

@Component
public class Student {
    
    @Autowired
    @Qualifier("jeep")
    private Vehicle vehicle;

}

public interface Vehicle{}

@Component("jeep")
public Jeep implements Vehicle{}

@Component("van")
public Van implements Vehicle{}
...