Spring 中的 Bean 有多个实现类,该怎么指定注入?

在Spring中,当一个接口有多个实现类时,Spring默认会按类型进行自动装配。如果有多个相同类型的Bean(也就是多个实现了同一接口的Bean),Spring将会抛出NoUniqueBeanDefinitionException异常,因为它无法确定应该注入哪个Bean。

解决这个问题的一种方式是使用@Primary注解。你可以在你想要优先注入的Bean上添加@Primary注解:

@Service
@Primary
public class PrimaryService implements ServiceInterface {
    //...
}

@Service
public class SecondaryService implements ServiceInterface {
    //...
}

在这个例子中,如果我们在其他地方进行ServiceInterface类型的自动装配,Spring将会注入PrimaryService,因为它被标注了@Primary注解。

另一种方式是使用@Qualifier注解,如前面所述,这个注解可以用来消除自动装配的歧义:

public class SomeClientClass {

    private ServiceInterface service;

    @Autowired
    @Qualifier("secondaryService")
    public void setService(ServiceInterface service) {
        this.service = service;
    }

    //...
}

在这个例子中,我们在setService方法上使用了@Autowired@Qualifier("secondaryService")注解。Spring将会注入名称为secondaryServiceServiceInterface实现,而不是其他的实现。这样,我们就可以很精确地控制哪个Bean被注入。

发表评论

后才能评论