Spring 如何从@Bean返回与其他Bean有依赖关系的Bean

Spring 如何从@Bean返回与其他Bean有依赖关系的Bean,spring,spring-annotations,Spring,Spring Annotations,我有一个@Configuration注释类,它有@Bean注释的方法。其中大多数只返回没有DI依赖项的新实例,例如: @Bean public UserService getUserService() { return new InMemoryUserService(); } 但是一些bean需要构造函数注入,例如 @Bean public BookingService getBookingService() { return new InMemoryBookingServic

我有一个@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
}

我该怎么做呢?

只需将所需的bean作为参数传递给该方法即可

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

@Bean
public BookingService getBookingService(UserService userServ) {
    return new InMemoryBookingServiceImpl(userServ); 
}
这里,当Spring访问
getBookingService
时,它将看到它需要类型为
UserService
的bean,并将在上下文中查找一个bean

所有依赖项注入规则都适用。例如,如果没有找到该类型的bean,则抛出异常,或者如果找到多个该类型的bean,则必须使用
@Qualifier
指定所需bean的名称,或者使用
@Primary
标记其中一个bean

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

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

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

为什么需要显式创建InMemoryBookingServiceImpl的实例?可以将其注释为@Component吗?通过在MemoryBookingServiceImpl中用
@Component
注释
类,同时将依赖项自动连接到bean中,创建bean不是很容易吗?只是对第二个选项(调用该方法)的注释。Spring有一些强大的伏都教(字节码操纵),它仍然会创建一个
UserService
实例,即使多次调用方法
getUserService()