【问题标题】:How to return from @Bean a bean that has dependencies to other beans [duplicate]如何从@Bean返回一个依赖于其他bean的bean [重复]
【发布时间】:2016-09-23 12:30:01
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 为什么需要显式创建 InMemoryBookingServiceImpl 的实例?可以注释为@Component吗?
  • @Component 注释InMemoryBookingServiceImpl 类,同时将依赖项自动装配到其中,会不会更容易创建bean?

标签: spring spring-annotations


【解决方案1】:

只需将所需的 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 的名称,或者用标记其中一个 bean @Primary

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

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

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

【讨论】:

  • 只是对第二个选项(调用方法)的评论。 Spring 有一些强大的巫术(字节码操作),它仍然会创建一个 UserService 的实例,即使方法 getUserService() 被多次调用。
猜你喜欢
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2014-06-28
  • 2014-06-04
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多