Spring 如何从@Bean返回与其他Bean有依赖关系的Bean
我有一个@Configuration注释类,它有@Bean注释的方法。其中大多数只返回没有DI依赖项的新实例,例如: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
@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()
。