如何从@Bean返回一个依赖于其他bean的bean

时间:2016-05-25 18:27:02

标签: spring spring-annotations

我有一个@Configuration注释类,它有@Bean注释方法。他们中的大多数只返回没有DI依赖关系的新实例,例如:

@Bean
public UserService getUserService() {
    return new InMemoryUserService();
}

但是有些bean需要构造函数注入,例如

@Bean
public BookingService getBookingService() {
    return new InMemoryBookingServiceImpl(???); // i need to inject UserService to constructor
}

我该怎么做?

1 个答案:

答案 0 :(得分:3)

只需将您需要的bean作为参数传递给方法。

@Bean
public UserService getUserService() {
    return new InMemoryUserService();
}

@Bean
public BookingService getBookingService(UserService userServ) {
    return new InMemoryBookingServiceImpl(userServ); 
}

当Spring到达getBookingService时,它会看到它需要一个类型为UserService的bean,并在上下文中寻找一个。

请参阅docs

所有依赖注入规则都适用。就像没有找到那种类型的bean一样抛出异常,或者如果找到更多那种类型的bean,你必须使用@Qualifier来指定你想要的bean的名称,或者标记其中一个@Primary

的豆子

另一个选择是直接使用生成依赖项bean的方法:

@Bean
public UserService getUserService() {
    return new InMemoryUserService();
}

@Bean
public BookingService getBookingService() {
    return new InMemoryBookingServiceImpl(getUserService()); 
}